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要有效