模板别名(正式的名称为"template typedef")

如何在某个模板类的基础上,通过写死(绑定)部分模板参数类型,来定制出一个新的模板类?

尝尝我这种写法如何:

template<class T>
// 采用了自定义内存分配器的std::vector
using Vec = std::vector<T,My_alloc<T>>;

// 使用My_alloc为元素分配存储空间
Vec<int> fib = { 1, 2, 3, 5, 8, 13 };

// verbose与fib类型一致
vector<int,My_alloc<int>> verbose = fib;

有了using语法,定义模板别名则可一目了然:using 模板别名 = 引用细节;。在这之前,我们也曾徘徊在”typedef”的经典和复杂之间左右为难,但没有哪一个方案能做到完美平衡,直到后来我们干脆弃而转向言简意赅的using语法。

即使模板存在特化,using语法也能照常使用。(需注意:为模板及其各种特化形式可以设定一个统一的别名,但反之则不然:模板特化操作不能通过别名进行)。例如:

template<int>
// idea: int_exact_trait<N>::type用于表达含有N个bit的数值类型
struct int_exact_traits {
    typedef int type;
};

template<>
struct int_exact_traits<8> {
    typedef char type;
};

template<>
struct int_exact_traits<16> {
    typedef char[2] type;
};

// ...

template<int N>
// 定义别名用以简化书写
// 译注:给模板的通用版本取别名,则其所有的特化版本自动获得该别名,
//    例如对于8bit的特化版本,现在可直接使用别名
    using int_exact = typename int_exact_traits<N>::type;
    // int_exact<8> 是含有8个bit的数值类型
int_exact<8> a = 7;

除了在模板方面身担重任外,using语法也可作为对普通类型定义别名的另一种选择(相较于typedef更合吾意)。

typedef void (*PFD)(double);    // C 样式
using PF = void (*)(double);    // using加上C样式的类型
using P = [](double)->void;  // using和函数返回类型后置语法

参考:

参考:

(翻译:张潇,dabaitu)