非类型参数: non-type template argument, 支持的类型定义
an integral type;
bool, char, signed char, unsigned char, wchar_t,
char16_t, char32_t, short, unsigned short, int, unsigned int,
long, unsigned long, long long, unsigned long longan enumeration type.
另一种形态的数字.a std::nullptr_t
空指针类型a pointer type (to object or to function);
指向对象或函数的指针类型.a pointer to member type (to member object or to member function);
指向类或函数成员的指针类型.
Array
std::array
是一个典型的 non-type 模板类参数, 它的原型代码是:
template<typename T, size_t n> class array {};
其中size_t n
就是一个 non-type 参数, 用于限定数组的大小.
#include <iostream>
#include <array>
using std::cout;
using std::endl;
using std::array;
// array prototype:
// template<typename T, size_t n> class array {};
int main(void) {
// 第一个参数 typename T, 要求的是一个类型.
// 第二个参数 size_t n, 要求的是一个具体的值.
array<int, 10> a {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto ele: a) {
cout << ele << " ";
}
cout << endl;
// output:
// 0 1 2 3 4 5 6 7 8 9
return 0;
}
enable_if
std::enable_if
也是一个典型的 non-type 模板参数, 下面这个代码块是它的源码.
它利用了bool
当作 non-type 参数, 将条件限定为两种结果:
如果 non-type 的值是true
,enable_if
就会在自身结构中增加一个名为type
的成员.
如果 non-type 的值是false
,enable_if
就不会增加名为type
的成员.
template <bool _Test, class _Ty = void>
struct enable_if {};
// 编译器在编译期自动给这里加上 默认类型: template<class _Ty=void>
// 然后再去查找调用, 如果调用提供了其他类型, 那么才会覆盖掉`void`默认类型.
// 另外, 这个enable_if模板优先级高过上面的enable_if模板.
template <class _Ty>
struct enable_if<true, _Ty> {
using type = _Ty;
};
样例代码
#include <iostream>
using std::cout;
using std::endl;
// 不使用 std::enable_if, 自定义一个 enable_if.
template<bool B, class T = void>
struct enable_if {
enable_if() {
cout << "template<bool B, class T = void>: " << typeid(T).name() << endl;
}
};
template<class T>
struct enable_if<true, T> {
typedef T type;
enable_if() {
cout << "template<class T>: " << typeid(type).name() << endl;
}
};
int main(void) {
enable_if<false>();
enable_if<true>();
// output:
// template<bool B, class T = void>: void
// template<class T>: void
return 0;
}