面试题答案
一键面试非类型参数在编译时计算的基本原理
在C++函数模板中,非类型参数是在编译时确定其值的。编译器在实例化模板时,会用实际的参数值替换模板中的非类型参数。这些参数值必须是编译期常量表达式,因为编译器需要在编译阶段就知道其确切值,以便生成相应的代码。这样一来,一些依赖于这些参数值的计算就可以在编译时完成,而不是在运行时,从而提高效率。
示例代码
#include <iostream>
// 函数模板,利用非类型参数计算数组大小
template <typename T, size_t N>
size_t arraySize(const T (&arr)[N]) {
return N;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
size_t size = arraySize(arr);
std::cout << "数组大小为: " << size << std::endl;
return 0;
}
在上述示例中,arraySize
函数模板接受一个数组引用作为参数,其第二个参数N
是一个非类型参数,表示数组的大小。编译器在实例化arraySize
模板时,会根据传入数组的实际大小确定N
的值,并在编译时计算出数组的大小,而不需要在运行时进行额外的操作。