请解释以下函数,该函数返回数组的大小

时间:2011-12-06 05:36:46

标签: c++ arrays sizeof

  

可能重复:
  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;
}

我了解TS,但我的问题是为什么我们 v声明为参考变量?或者我可能误解了这一切。

我很感激帮助!

2 个答案:

答案 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;
}

这不会给你任何尺码信息。