可能重复:
Can someone explain this template code that gives me the size of an array?
template <typename T,unsigned S>
unsigned ArraySize(const T (&v)[S])
{
return S;
}
我了解T
和S
,但我的问题是为什么我们 将v
声明为参考变量?或者我可能误解了这一切。
我很感激帮助!
答案 0 :(得分:2)
该函数通过引用接受数组,因此,编译器推断出元素T
和大小S
的类型。所以它返回S
,这只是数组的大小。如果没有引用,它将衰减为指针类型。所以这些没有区别:
void f(int v[100]); //declaration of f
void f(int v[200]); //redeclaration of f
void f(int v[]); //redeclaration of f
void f(int *v); //redeclaration of f
一切都完全相同。您可以将任何大小的数组传递给所有这些函数。
回到ArraySize
,此函数的返回值不能用作常量表达式:
int a[10];
SomeClassTemplate<ArraySize(a)> obj; //error
请参阅错误:http://ideone.com/4mdJE
因此,更好的实施方式是:
template <typename T,unsigned S>
char (&ArraySizeHelper(const T (&v)[S]))[S]; //no need to define it!
#define ArraySize(a) sizeof(ArraySizeHelper(a))
现在这很好:
int a[10];
SomeClassTemplate<ArraySize(a)> obj; //ok
请参阅ok:http://ideone.com/Zt3UY
答案 1 :(得分:2)
如果v不是参考,那么你会得到:
template <typename T,unsigned S>
unsigned ArraySize(const T v[S])
{
return S;
}
但在这种情况下使用[]只是另一种写作方式
template <typename T,unsigned S>
unsigned ArraySize(const T *v)
{
return S;
}
这不会给你任何尺码信息。