template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
然後使用這個arraysize宏就可以在編譯時求出數組的大小
初看這段代碼,我表示很糾結,發給同學討論了下,然後表示有點眉目了,其實這就是一個編譯時求數組大小的一個寫法,當然我們也可以寫成
#define arraysize(array) (sizeof(array)/sizeof(array[0])) 這樣的格式,這種格式相信所有人都能看懂,我想其最所以不這麼寫是因為考慮到效率問題吧,避免了上述寫法的除法運算,除運算則是在四則運算裡面最耗時的(傷不起的C++,效率高了,可讀性下降的不止一點兩點哈)
可以自己寫個小程序測試一下:
1 #include "stdafx.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 template <typename T, size_t N>
6 char (&ArraySizeHelper(T (&array)[N]))[N];
7 #define arraysize(array) (sizeof(ArraySizeHelper(array)))
8
9 int _tmain(int argc, _TCHAR* argv[])
10 {
11
12 double a[200];
13
14 double* b = new double [100];
15 int cnt = arraysize(a);
16 printf("%d
",cnt);
17
18 system("pause");
19
20 return 0;
21 }輸出是200,將a數組類型換成int,char等結果依舊是200,這個比較好理解,因為采用template模板編程,泛型編程.......但是這種用法只能確定編譯時段尺寸確定好了的數組,若不然如果是采用動態數組,比如將代碼15行中的a換成b,則編譯失敗.......
其實大致流程是:T[N]的引用->char[N]的引用,最後就是sizeof(char[N]),char其實就是Byte,輸出也即N ^_^