为什么这个数组大小的模板不起作用?

时间:2014-06-11 16:38:51

标签: c++ arrays templates size c++14

作为使用模板的一些练习,我尝试编写一个函数模板来查找数组的大小:

template <typename T>
size_t arraySize(T array[]) {
    return (sizeof(array)/sizeof(T));
}

然后我尝试使用一些不同数据类型的数组以及常规sizeof(数组)/ sizeof(数据类型)计算来测试模板,如下所示:

int main(){

int arr1[20];
char arr2[20];
double arr3[20];

cout << arraySize(arr1) << ' ' << arraySize(arr2) << ' ' << arraySize(arr3) << endl;
cout << sizeof(arr1)/sizeof(int) << ' ' << sizeof(arr2)/sizeof(char) << ' ' << sizeof(arr3)/sizeof(double);

}

输出

2 8 1
20 20 20

为什么此模板无法按预期工作?

注意:我知道在堆栈溢出(such as this one)上存在与数组大小相关的其他问题,但是我很担心为什么这个特定代码不起作用。

2 个答案:

答案 0 :(得分:8)

问题是T array[]确实是T* array。要获得实际大小,您需要通过引用传递数组,即参数T (&array)[N],其中N是整数模板参数。

答案 1 :(得分:6)

当你没有传递对大小数组的引用时,

Arrays decay to pointers

#include <cstddef>
#include <iostream>

template <typename T, std::size_t N>
size_t arraySize(T const (& array)[N]) {
    return N; // equivalent to: (sizeof(array)/sizeof(T));
}

using namespace std;

int main(){

int arr1[20];
char arr2[20];
double arr3[20];

cout << arraySize(arr1) << ' ' << arraySize(arr2) << ' ' << arraySize(arr3) << endl;
cout << sizeof(arr1)/sizeof(int) << ' ' << sizeof(arr2)/sizeof(char) << ' ' << sizeof(arr3)/sizeof(double);

}

Live Example打印6次20。

更新:即将推出的C ++ 1y标准有一个当前提案N4017,该标准在标准库中提出了非成员size()功能。对于所有标准容器,这将委托给size()成员函数,但对于原始数组,建议的实现几乎相同(添加constexprnoexcept)到我写的内容以上:

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}