【问题标题】:Please explain the following function which returns the size of an array [duplicate]请解释以下返回数组大小的函数[重复]
【发布时间】:2011-12-06 05:36:46
【问题描述】:

可能重复:
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 声明为引用变量?或者我可能误解了这整件事。

感谢您的帮助!

【问题讨论】:

  • 糟糕,很抱歉。我真的不知道使用什么关键字来搜索我的问题。

标签: c++ arrays sizeof


【解决方案1】:

函数通过引用接受一个数组,因此,编译器推断出元素类型T 和大小S。所以它返回S,它只是数组的大小。在没有 reference 的情况下,它会衰减为指针类型。所以这些没有区别:

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

请看:http://ideone.com/Zt3UY

【讨论】:

【解决方案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;
}

这不会给你尺寸信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多