最近在chromium的代码里面发现了一个有意思的求写法数组个数的写法
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
传统的做法就是
#define(array) sizeof(array) / sizeof(array[0])
据官方的说法的优点是,就是能在编译时判断array是不是定长数组,而不是指针。而明显传统的就不能了。
ArraySizeHelper事实上就是一个模版函数的定义。
这个函数就是输入一个定长数组引用,返回一个定长char数组的引用。
有两点需要明确:
(1) 数组的引用 跟 指向数组的指针 是两个不同的概念,数组的引用就代表整个数组,指针是这个数组的首地址
(2) 如下面函数
char (&xx())[1024]
{
static char yy[1024];
return yy;
}
就是返回一个定长数组。(PS: 我相信大部分人不知道可以这样写,一般也不会写这样的函数。)
这样arraysize就能根据传入的参数和模版生成对应的函数,而这个函数正是返回char (&)[N],这样就能用sizeof判断个数了。
以此同时,模版函数的参数检验了是否定长数组。