MISC
使用别名
我们可以使用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