这个“数组大小”模板功能如何工作?

时间:2010-07-30 05:25:21

标签: c++ arrays templates size sizeof

  

可能重复:
  Can someone explain this template code that gives me the size of an array?
  Magic arguments in function templates…

有人可以解释这段代码的工作原理吗?我知道这段代码的目的是获取数组的长度,但我不知道这段代码是如何工作的:

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}

感谢。

1 个答案:

答案 0 :(得分:58)

首先让我们剖析参数T(&)[size]。首先从内到外,从右到左,括号组读取声明:它是一个未命名的参数,它是对类型为size的{​​{1}}大小的数组的引用。

也就是说,它接受对任何数组的引用,其中数组的类型和大小是模板参数。

如果我们这样称呼它:

T

编译器将尝试推导出模板参数。要使参数类型与您传递的内容相匹配,int a[10]; GetArrLength(a); 必须为Tint必须为10(使参数成为对10 size s数组的引用)。

然后返回该大小,为您提供数组中元素的数量。


此代码有两个“问题”。首先,大小不能是负数,因此使用带符号的类型作为模板参数和返回类型是没有意义的。相反,应该使用无符号类型;最好的是int

std::size_t

第二个是这个函数的结果不是常量表达式,即使数组的大小是。虽然在大多数情况下都没问题,但如果我们能从中得到一个常量表达式会更好。这就是你最终得到这个解决方案的地方:

template<typename T, std::size_t Size>
std::size_t GetArrLength(T(&)[Size]) { return size; }

这样使用:

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))

它有三个作用:第一个是与上面相同的想法,将填写模板参数,为您提供数组的大小。

第二部分是使用该信息来创建具有特定大小的类型,因此int a[10]; const std::size_t n = sizeof_array(a); // constant-expression! 帮助器。那部分并不是绝对必要的,但我认为它使代码更容易阅读。 type_of_size的大小始终等于char[N],因此我们可以滥用它来“存储”数组的大小...以类型本身的大小!

第三部分是使用N获得该大小。它实际上并没有评估任何东西,所以我们不需要函数的定义。它简单地说“如果你这样做......那么大小......”。大小是sizeof数组中的“存储”大小。

相关问题