作为使用模板的一些练习,我尝试编写一个函数模板来查找数组的大小:
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)上存在与数组大小相关的其他问题,但是我很担心为什么这个特定代码不起作用。
答案 0 :(得分:8)
问题是T array[]
确实是T* array
。要获得实际大小,您需要通过引用传递数组,即参数T (&array)[N]
,其中N
是整数模板参数。
答案 1 :(得分:6)
#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()
成员函数,但对于原始数组,建议的实现几乎相同(添加constexpr
和noexcept
)到我写的内容以上:
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}