《Effective Modern C++》学习笔记之条款九:优先选用别名声明,而非typedef

博客介绍了using别名声明和typedef声明都可完成类型声明,但using操作更简单直接,尤其在模版操作时优势明显。还指出在模板内用typedef创建链表需加typename前缀,而using则无需,体现了using的便利性。

using别名声明和typedef声明都可以完成一个类型的声明,但使用using可以很简单且直接的完成这个操作,特别是模版操作时,下面将通过代码分别声明相同的类型,就可以看出using的好处了。

// 声明指针函数
typedef void(*FP)(int ,double);   // typedef晦涩不直白
using FP = void(*)(int ,double);  // using简单直白


// typedef声明一个模板,表示一个链表
template<class T>
struct MyAllocList{
  typedef std::list<T,MyAlloc<T>> type; // typedef晦涩不直白
};

MyAllocList::type myList;  // 类型使用晦涩不直白


// using 声明一个模板,表示一个链表
template<class T>
using MyAllocList std::list<T,MyAlloc<T>>; // using简单直白
MyAllocList myList; // 类型使用简单直白

还有一种更糟糕的情况,那就是如果这时候你想在一个模板内,使用typedef来创建一个链表,且它容纳的类型由模板参数指定,这时候你不得不在typedef的前面加上一个typename前缀,以表明该typedef是一个类型,十分麻烦复杂。但是使用using的话,完全不必要。

// typedef声明一个模板,表示一个链表
template<class T>
struct MyAllocList{
  typedef std::list<T,MyAlloc<T>> type; // typedef晦涩不直白
};

template<class T>
class Widget {
private:
    typename MyAllocList<T>::type list; // 必须加上typename,否则编译器不知道其是个类型
};


// using 声明一个模板,表示一个链表
template<class T>
using MyAllocList std::list<T,MyAlloc<T>>; // using简单直白

template<class T>
class Widget {
private:
    MyAllocList<T> list; // so easy
};

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值