Item9 Prefer alias declarations to typedefs

[复制链接]

该用户从未签到

759

主题

763

帖子

4660

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4660
跳转到指定楼层
楼主
发表于 2018-6-4 16:08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C++11中引入的std::unique_ptr智能指针是个好用的东西,在我们使用unique_ptr的时候往往会写出这样的类型std::uniqeu_ptr<std::unordered_map<std::string,std::string>>,看上去很臃肿,因此大多数的时候我们会选择使用typedef进行类型的重定义,简化类型名称。可是在C++11中引入了一个using别名的机制,相比较而言引入这个机制会有其深层次的用意。
  1. typedef void(*FP)(int,const std::string&);
  2. using FP = void(*)(int,const std::string&);
复制代码
看上去using别名机制更加清晰,这或许是引入using别名机制的原因之一吧。
  1. template<typename T>
  2. using aliasList = std::list<T>;

  3. aliasList<int> li;

  4. template<typename T>
  5. struct aliasList {
  6.     typedef std::list<T> type;
  7. };
  8. aliasList<int>::type li;
复制代码
typedef没有办法在模板声明的作用域中做类型重定义,必须放在一个自定义类型作用域内。而using没有这个限制除了上面提到的两点外using还有一些其他的优点,比如对于嵌套类型来说不需要使用typename。
  1. template<typename T>
  2. class Widget {
  3. private:
  4.     typename aliasList<T>::type list;
  5. };
复制代码
使用typedef定义的嵌套类型在模板中需要使用typename,至于为什么可以参考cppreference
对于using来说则不一样,因为使用了using就不会有::type这样的后缀,因为这个后缀会让编译器迷惑这到底是类型还是成员变量,使用using则避免了这个问题,因为没有::type,并且aliasLitst<T>肯定是一个类型。尽管using有以上诸多优点但是C++11中的type_trais却大量用了typedef,不过好在C++14中标准委员会认识到了using是最好的方式并对C++11中的全部进行了替换。
  1. std::remove_const<T>::type;
  2. std::remove_reference<T>::type;
  3. std::add_lvalue_reference<T>::type;
复制代码
到了C++14上面的::type都可以去掉了。


分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表