Item9:优先选用别名声明,而非typedef
具有两种声明别名的方法:
1 | typedef std::unique_ptr<std::unordered_map<std::string, std::string>> UPtrMapSS; |
别名声明在处理涉及函数指针的类型时比较容易理解:
1 | //FP是一个指向函数的指针的同义词,它指向的函数带有int和const std::string&形参,不返回任何东西 |
别名声明可以模板化(被称为别名模板),而typedef不行:
使用别名声明:
1 | template<typename T> |
使用typedef需要从头开始:
1 | template<typename T> |
模板内使用的差异:typename 的必要性
模板内引用嵌套typedef的类型时,必须加typename前缀(因MyAllocList<T>::type是依赖类型—— 编译器无法确定特化版本中::type是否为类型):
1 | template<typename T> |
而别名模板无需typename(编译器明确其结果必为类型,属于非依赖类型):
1 | template<typename T> |
类型特性(type traits)场景的适配
C++11 的 type traits(如类型转换)基于struct嵌套typedef实现,使用时需::type后缀 + 模板内typename:
1 | // C++11:需::type后缀,模板内还需加typename |
C++14 提供了基于别名声明的简化版本(后缀_t),无需::type和typename;即便仅支持 C++11,也可手动仿写这些别名模板:
1 | // C++14简化版 |
总结
typedef不支持模板化,但别名声明支持。- 别名模板可以让人免写
::type后缀,并且在模板内,对于内嵌typedef的引用经常要求加上typename前缀。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 肖恩的博客!
评论
