目录
一、非类型模板参数概念
通常来说,模板,不管是函数模板还是类模板,其参数都是类型
但有时模板参数可能不是类型,而是一个常量
二、非类型模板参数经典用法
如果没有非类型模板参数,我们只能使用宏常量,而且不同大小的静态数组需要写不同的类
使用非类型模板参数(可设置缺省值),不同大小的静态数组由类模板实例化出不同的类来创建
(不同大小的静态数组都需要不同的类来创建,但是非类型模板参数是通过模板,由编译器实例化出不同的类;而非模板的写法则需要人为手写多个类和不同宏常量,来构建不同大小的静态数组)
namespace bit {
// 定义一个模板类型的静态数组
template<class T, size_t N = 10>
class array
{
public:
T& operator[](size_t index) { return _array[index]; }
const T& operator[](size_t index)const { return _array[index]; }
size_t size()const { return _size; }
bool empty()const { return 0 == _size; }
private:
T _array[N];
size_t _size;
};
}
void test()
{
bit::array<int, 10> a1;
bit::array<int, 100> a2;
bit::array<int, 1000> a3;
}
三、非类型模板参数局限性
C++20之前仅支持整型的非类型模板参数
C++20之后支持各种类型的非类型模板参数,如template<class T, string str>