为什么我们需要一个用于计算数组大小的模板,为什么我不能直接使用诸如int这样的预定义数据类型进行计算
我看过类似
的代码template<typename T,int SIZE>
size_t array_size(const T (&array)[SIZE])
{
return SIZE;
}
如果我们直接使用int为何会抛出错误,而不是模板
int N;
int size(int (&arr1)[N]) //Passing the array by reference
{
return N; //Correctly returns the size too [cool trick ;-)]
}
如何计算大小
答案 0 :(得分:4)
数组的大小是其类型的一部分。当您创建类似
的数组时int array[5]{};
然后它的类型实际上是int[5]
,而不是int[]
或int*
。那意味着当你这样做
template<typename T,int SIZE>
size_t array_size(const T (&array)[SIZE])
{
return SIZE;
}
,例如,您传递array
,编译器从T
推导SIZE
和int[5]
,则分别得到int
和5
int N;
int size(int (&arr1)[N]) //Passing the array by reference
{
return N; //Correctly returns the size too [cool trick ;-)]
}
另一方面,不会做同样的事情。这声明了一个函数,该函数采用大小为N
的数组,但是由于N
不是常量表达式,它甚至都不会编译。即使您具有非标准扩展名(例如gcc的VLA扩展名),N
也将永远不会更改,并且代码仍将无法编译。即使编译,N
也不会改变,因此无论传递什么大小的数组,该函数始终会返回相同的结果。