C++11快餐教程(1)-通过using定义类型的别名

C++11快餐教程(1)-通过using定义类型的别名

在C/C++中,我们经常通过typedef来定义类型的别名。

例如:

typedef unsigned char u1;
typedef unsigned short u2;

但是,这样定义有一点不好,新定义的别名是放在后面的。一般我们都是通过别名找原名,从后往前找还是不方便的。
那么,我们把别名定义在前面好不好?

using u4 = uint32_t;
using u8 = uint64_t;

在C++11中,using不再只是用于using namespace啦,从此在别名领域大显身手。

using用来定义别名,特别适用于在模板的情况下:
下面的例子来源于ART中的容器类型的定义:

template <typename T>
using ArenaDeque = std::deque<T, ArenaAllocatorAdapter<T>>;

template <typename T>
using ArenaQueue = std::queue<T, ArenaDeque<T>>;

template <typename T>
using ArenaVector = std::vector<T, ArenaAllocatorAdapter<T>>;

template <typename T, typename Comparator = std::less<T>>
using ArenaSet = std::set<T, Comparator, ArenaAllocatorAdapter<T>>;

template <typename K, typename V, typename Comparator = std::less<K>>
using ArenaSafeMap =
    SafeMap<K, V, Comparator, ArenaAllocatorAdapter<std::pair<**const** K, V>>>;

有了上面的定义之后,我们的封装后的类型就可以泛型使用了:

ArenaVector<MIRLocation> method_stack_;        // Include stack

这是typedef无法实现的哦。

小结一下:

  • C++11中的using关键字可以实现typedef的功能,而using的定义顺序有利于查找
  • using在模板类型的别名定义比typedef要有效
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容