模板除了定义类型参数之外,也可以在模板内定义非类型参数
非类型参数不是类型,而是值,比如:指针,整数,引用
非类型参数的用法:
1.整数常量:非类型参数最常见的形式是整数常量,可以用于定义数组大小,循环次数等
2.指针和引用:虽然不如整数常量长剑,但指针和引用也可以作为非类型参数
3.枚举类型:C++11及更高版本允许使用枚举类型作为非类型参数
函数模板中的非类型参数
#include <iostream>using namespace std;template <typename T,unsigned size>
void showArr(T (&arr)[size]){for(int i=0;i<size;i++){cout<<arr[i]<endl;}
}int main(){int a[5]={9,7,5,3,1};showArr<int,5>(a);return 0;
}
上面的例子,函数模板中接收一个非类型参数size,作为数组arr的大小
类模板的非类型参数
#include <iostream>using namespace std;template <int N> //定义一个类模板,使用非类型参数N
class Array{public:int data[N];void print(){for(int i=0;i<N;++i){cout << data[i] << "";}cout << endl;}
};int main(){Array<5> arr;for(int i=0;i<5;++i){arr.data[i] = i*2;}arr.print();//输出:0,2,4,6,8return 0;
}
在这个例子中, Array 类模板接受一个非类型参数 N ,用于定义数组 data 的大小
非类型参数的要求
必须是编译时的常量:非类型参数必须是编译时的常量,例如常量表达式或constexpr变量
类型限制:非类型参数的类型通常是整形(如int char enum)或指向外部链接的指针,引用。从
模板实例化 :每个不同的非类型参数值都会生成不同的模板实例,这可能会导致代码膨胀和编译时间增加。
指针作为非类型参数
#include <iostream>
using namespace std;
// 定义一个函数模板,使用指针作为非类型参数
template <int* ptr>
void printValue() {cout << "The value is: " << *ptr << endl;
}
int main() {static int value = 42;printValue<&value>(); // 输出:The value is: 42return 0;
}
在这个例子中, printValue 函数模板接受一个指向整数的指针作为非类型参数,并打印该指针指向的值