带有模板的数组的大小

时间:2019-02-11 14:00:52

标签: c++ c++11

为什么我们需要一个用于计算数组大小的模板,为什么我不能直接使用诸如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 ;-)]
}

如何计算大小

1 个答案:

答案 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推导SIZEint[5],则分别得到int5

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也不会改变,因此无论传递什么大小的数组,该函数始终会返回相同的结果。