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\n
"
,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 ^_^
某位朋友给的网址,将这个问题说的比较透彻,有兴趣大家可以看看(同时关于误删了这位朋友的评论,表示歉意):http://blog.csdn.net/yuanmanzheng/article/details/5472967
转自http://www.cppblog.com/longzxr/archive/2011/07/08/150453.html