神秘的oneliner模板代码,任何一个?

时间:2009-07-24 18:34:01

标签: c++ arrays templates metaprogramming

我正在读这页: C++ Tip: How To Get Array Length。作者提出了一段代码来了解静态数组的大小。

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;} // what does '(&)' mean ?
.
.
.
int arr[17];
int arrSize = GetArrLength(arr); // arrSize = 17

任何人都可以了解这段代码,因为我无法理解它是如何运作的。

4 个答案:

答案 0 :(得分:7)

该函数将引用(&)传递给类型为T且大小为size的数组。

答案 1 :(得分:1)

的sizeof(X)/的sizeof(X [0])

如果数组降级为指针类型,则不会捕获错误,但它仍然会编译!

模板版本是防弹。

答案 2 :(得分:1)

T(&amp;)[size]是对T [size]的引用。如果你不使用引用C ++会将T [size]视为T *,并且函数模板参数推断不起作用。

答案 3 :(得分:0)

哇,这太棘手了。我也不知道,但如果你继续阅读该页面上的评论:

  

基本上是

     

int arr [17]; int arrSize =   GetArrLength(ARR);

     

创建此功能:

     

int GetArrLength(int(&amp;)[17]){return   17;}

所以&amp;必须像往常一样意味着引用,所以它引用了数组类型,并且大小(模板中的第二项)就是传入数组的大小。

想想我会坚持旧的

sizeof(x)/sizeof(x[0])