模板与泛型(四)


使用别名

我们可以使用typedef来给一个模板类定义别名

typedef Blob<string> StrBlob

在C++11中, 我们也可以为类模板定义别名

template<typename T> using twin = pair<T,T>;
twin<string> authors; //authors的类型是pair<string, string>

typename的作用

typename用来告诉模板如何解析T::foo此类的代码。上一节可知类模板可以有静态成员,那么T可以指代一个模板类,即存在Foo<int>::foo的代码,其中foo为一个静态成员。但是同样的代码也可以指代某个类的类型成员,比如我们前面Blob类中的Blob<T>::size_type。因此编译器无法知道T::foo表示的到底是哪一种情况,此时需要typename来显式的告诉编译器foo是一个类型而非变量。

template<typename T>
struct Obj {
    using type = T;
};
template <typename T>
void f() {
    typename Obj<T>::type var;
}

上面的例子可以很直观的看出这一点,当编译器在编译 typename Obj<T>::type var;时,会将Obj<T>::type认为是某种类型。如果不加typaname,编译器则会将Obj<T>::type var理解为访问Obj<T>的静态成员,从而报错。

### “Dot Template”

Useful C++ Resources