我遇到了这个片段
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
在这篇文章中http://software.intel.com/en-us/articles/pvs-studio-vs-chromium/
我见过其他模板可以做同样的事情,比如这个
Use templates to get an array's size and end address
我理解这些,但我在这方面遇到了困难。
任何帮助将不胜感激。
最佳答案
函数模板被命名为 ArraySizeHelper
,用于接受一个参数、对 T [N]
的引用并返回对 的引用的函数字符 [N]
.
宏将您的对象(假设它是 X obj[M]
)作为参数传递。编译器推断 T == X
和 N == M
。所以它声明了一个返回类型为 char (&)[M]
的函数。然后宏用sizeof
包装这个返回值,所以它真的在做sizeof(char [M])
,也就是M
。
如果你给它一个非数组类型(例如一个T *
),那么模板参数推断将失败。
正如@Alf 在下面指出的那样,这种混合模板-宏系统相对于替代的纯模板方法的优势在于它为您提供了一个编译时常量。
关于c++ - 这个数组大小模板是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376000/