非类型模板参数
除了作为模板参数的类型,我们可以声明符合以下条件之一的常量表达式的值:
- 积分或枚举类型,
- 指向对象的指针或指向函数的指针,
- 左值引用对象或左值引用函数,
- 指向成员的指针,
std::nullptr_t
。
与所有模板参数一样,可以通过 Template Argument Deduction 显式指定,默认或派生非类型模板参数。
非类型模板参数用法示例:
#include <iostream>
template<typename T, std::size_t size>
std::size_t size_of(T (&anArray)[size]) // Pass array by reference. Requires.
{ // an exact size. We allow all sizes
return size; // by using a template "size".
}
int main()
{
char anArrayOfChar[15];
std::cout << "anArrayOfChar: " << size_of(anArrayOfChar) << "\n";
int anArrayOfData[] = {1,2,3,4,5,6,7,8,9};
std::cout << "anArrayOfData: " << size_of(anArrayOfData) << "\n";
}
显式指定类型和非类型模板参数的示例:
#include <array>
int main ()
{
std::array<int, 5> foo; // int is a type parameter, 5 is non-type
}
非类型模板参数是实现模板重现的方法之一,并且可以进行元编程 。