Skip to content

Latest commit

 

History

History
72 lines (53 loc) · 1.43 KB

File metadata and controls

72 lines (53 loc) · 1.43 KB

条款09:优先选用别名声明,而非typedef

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
...