我們一般在程式中計算陣列型別變數的大小通過定義如下的乙個巨集實現,如
num_elements
定義:#define num_elements(x) (sizeof((x))/sizeof((x)[0]))
該巨集在計算正確的陣列型別變數時不存在問題,但應用到指標上或應用到支援
過載的類時都會有問題。 通過
c++實現一種安全高效的陣列大小運算子
dimensionof()
,以下是該運算子的實現:
template
struct array_size_struct
;
template
array_size_structstatic_array_size_fn(t (&)[n]);
#define dimensionof(x)sizeof(static_array_size_fn(x).c)
原理:宣告乙個模板函式
static_array_size_fn()
,它接受乙個元素型別為
t、大小為
n的陣列的引用,t和
n分別作為它的兩個模板引數,這樣一來,指標以及使用者自定義型別就拒之門外了,該函式返回
array_size_struct
類模板的乙個例項,該類模板以
static_array_size_fn()
接受的陣列大小來實參化,且內部包含乙個對應大小的位元組陣列。
dimensionof()
巨集則簡單地將
sizeof
操作符應用到
static_array_size_fn
返回的例項中的陣列成員身上,從而得到陣列大小。 該
dimensionof()
總是在編譯期被求值,因此
dimensionof()
可以被用在常量可以使用的任何地方。
c++標準中,
sizeof
的運算元不會被求值,所以無需產生
static_array_size_fn()
函式體,從而該設施是零代價的,沒有任何執行期開銷,也不會**膨脹。
測試**如:
charcarray[40];
char*pcarray = carray;
vectorvecchar(50);
size_t c_carray = num_elements(carray); // ok
size_t c_pcarray = num_elements(pcarray); //
編譯通過,執行異常
size_t c_vecchar = num_elements(vecchar); //
編譯通過,執行異常
c_carray = dimensionof(carray); // ok
c_pcarray = dimensionof(pcarray); //
編譯不能通過
c_vecchar = dimensionof(vecchar); //
編譯不能通過
如例:對於危險的呼叫,利用上面的方式,在編譯期就可以把異常隔離起來,
c++模板元程式設計的功勞。現在可以方便的把
dimensionof
運算子應用到你的工程裡了。
注:參考《
imperfect c++》。
C 實現陣列大小運算子dimensionof
我們一般在程式中計算陣列型別變數的大小通過定義如下的乙個巨集實現,如 num elements 定義 define num elements x sizeof x sizeof x 0 該巨集在計算正確的陣列型別變數時不存在問題,但應用到指標上或應用到支援 過載的類時都會有問題。通過 c 實現一種安...
c 運算子過載實現陣列案例
includeusing namespace std class array 建構函式 array array int m length 拷貝建構函式 array array const array obj 析構函式 array array 求陣列的長度 int array length 過載操作符...
C 運算子過載實現陣列相加
第一種方式,物件屬性是指標 include iostream include iomanip include string.h include cmath include algorithm 演算法標頭檔案 using namespace std 利用物件對陣列相加 class group grou...