C++11提供别名声明(alias declaration):
using UPterMapSS =
std::unique_ptr<std::unordered_map<std::string, std::string>>;
typedef
和别名声明完成一样的工作。
别名声明还可以模板化,称为别名模板,而typedef
不行。
如下:
template <typename T>
using MyAllocList = std::list<T, MyAlloc<T>>;
MyAllocList<Widget> lw;
而 typedef
几乎需要从头自己动手:
template <typename T>
struct MyAllocList {
typedef std::list<T, MyAlloc<T>> type;
};
MyAllocList<Widget>::type lw;
更糟糕的情况是在模板内部使用typedef
创建一个链表时,需要在嵌套类型前添加typename
:
template <typename T>
class Widget {
private:
typename MyAllocList<T>::type list;
...
};
而使用别名模板则更简单:
template <typename T>
class Widget {
private:
MyAllocList<T> list;
};
C++11的type_traits
库可以执行类型变换:
std::remove_const<T>::type // const T -> T
std::remove_reference<T>::type // T&/T&& -> T
std::add_lvalue_reference<T>::type // T -> T&
它们的实现方法都是在模板struct
中使用 typedef
实现的,所以需要在每次使用它们之前加上 typename
。
C++14为它们添加了别名模板:
template <class T>
using remove_const_t =
typename remove_const<T>::type
...