这个数组大小模板是如何工作的

How does this Array Size Template Work?

本文关键字:何工作 工作 数组      更新时间:2023-10-16

我看到了这个片段

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/

我见过其他模板也做同样的事情,比如这个

使用模板获取数组';s大小和结束地址

我理解这些,但我在这方面遇到了困难。

如有任何帮助,我们将不胜感激。

函数模板名为ArraySizeHelper,用于接受一个参数、对T [N]的引用并返回对char [N]的引用的函数。

宏传递您的对象(假设它是X obj[M])作为参数。编译器推断出CCD_ 5和CCD_。因此,它声明了一个返回类型为char (&)[M]的函数。然后宏用sizeof包装这个返回值,所以它实际上是在执行sizeof(char [M]),也就是M

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

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

这不是最好的方法,但既然您在问:模板函数ArraySizeHelper的返回类型是char[N],其中函数的参数是一个类型为T的大小为N的(引用)数组。模板参数推导用匹配的数字N实例化这个模板,所以sizeof(char[N])就是N,这就是你得到的。

一个更好的版本可以写如下。(constexpr需要C++0x;如果省略它,这将不是一个常量表达式。)

template <typename T, size_t N> constexpr size_t array_size(const T (&)[N]) { return N; }

用法:

int x[20];
array_size(x); // == 20

更新:如果您使用C++0x,由于decltype:,这里有另一个提供constexpr的解决方案

#include <type_traits>
template <typename T> struct array_traits;
template <typename T, unsigned int N> struct array_traits<T[N]>
{
   static const unsigned int size = N;
   typedef std::decay<T>::type type;
};
// Usage:
int x[20];
array_traits<decltype(x)>::size; // == 20
MSDN上的这个博客准确地描述了它的工作原理。非常有趣的故事。看看它。