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
};
要点速记
- typedef声明不支持模板化,但using别名声明支持
- 使用别名using模板可以免写"::type”后缀,并且在模板内,对于内嵌typedef的引用经常要求添加typename前缀