c++ - 这个数组大小模板是如何工作的?

标签 c++ templates metaprogramming

我遇到了这个片段

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 == XN == M。所以它声明了一个返回类型为 char (&)[M] 的函数。然后宏用sizeof包装这个返回值,所以它真的在做sizeof(char [M]),也就是M

如果你给它一个非数组类型(例如一个T *),那么模板参数推断将失败。

正如@Alf 在下面指出的那样,这种混合模板-宏系统相对于替代的纯模板方法的优势在于它为您提供了一个编译时常量。

关于c++ - 这个数组大小模板是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376000/

相关文章:

c++在派生中定义模板化基类在IAR ARM编译器中不起作用

c++ - 我应该如何编写一个像 MPL 中那样工作的元函数?

xcode - 有什么好的Xcode脚本可以加快开发速度?

c++ - 与可变参数模板一起使用的基类列表

c++ - 调用模板化基类方法编译失败

metaprogramming - 了解 Raku 的 `&?BLOCK` 编译时变量

c++ - 创建安装包是否代替编译代码?

c++ - std::string.resize() 和 std::string.length()

c++ - 将发音归于不同的源代码概念是否可行?

c++ - 检查区域设置