C++模板 非类型参数

非类型参数: 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 long

  • an 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 class array {};
其中 size_t n 就是一个 non-type 参数, 用于限定数组的大小.

#include 
#include 
using std::cout;
using std::endl;
using std::array;

// array prototype: 
// template class array {};


int main(void) {
    // 第一个参数 typename T, 要求的是一个类型.
    // 第二个参数 size_t n, 要求的是一个具体的值.
    array 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 
struct enable_if {}; 

// 编译器在编译期自动给这里加上 默认类型: template
// 然后再去查找调用, 如果调用提供了其他类型, 那么才会覆盖掉`void`默认类型.
// 另外, 这个enable_if模板优先级高过上面的enable_if模板.
template           
struct enable_if { 
    using type = _Ty;
};

样例代码

#include 
using std::cout;
using std::endl;


// 不使用 std::enable_if, 自定义一个 enable_if.
template
struct enable_if {
    enable_if() {
        cout << "template: " << typeid(T).name() << endl;
    }
};


template
struct enable_if { 
    typedef T type; 
    enable_if() {
        cout << "template: " << typeid(type).name() << endl;
    }
};


int main(void) {

    enable_if();
    enable_if();

    // output:
    // template: void
    // template: void

    return 0;
}

你可能感兴趣的:(C++模板 非类型参数)