非类型模板参数

除了作为模板参数的类型,我们可以声明符合以下条件之一的常量表达式的值:

  • 积分或枚举类型,
  • 指向对象的指针或指向函数的指针,
  • 左值引用对象或左值引用函数,
  • 指向成员的指针,
  • 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
}

非类型模板参数是实现模板重现的方法之一,并且可以进行元编程