位置:base/common/strong_typedef.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| template <class T, class Tag> struct StrongTypedef { private: using Self = StrongTypedef; T t;
public: using UnderlyingType = T; template <class Enable = typename std::is_copy_constructible<T>::type> explicit StrongTypedef(const T & t_) : t(t_) {} template <class Enable = typename std::is_move_constructible<T>::type> explicit StrongTypedef(T && t_) : t(std::move(t_)) {}
template <class Enable = typename std::is_default_constructible<T>::type> StrongTypedef(): t() {}
StrongTypedef(const Self &) = default; StrongTypedef(Self &&) = default;
Self & operator=(const Self &) = default; Self & operator=(Self &&) = default;
template <class Enable = typename std::is_copy_assignable<T>::type> Self & operator=(const T & rhs) { t = rhs; return *this;}
template <class Enable = typename std::is_move_assignable<T>::type> Self & operator=(T && rhs) { t = std::move(rhs); return *this;}
operator const T & () const { return t; } operator T & () { return t; }
bool operator==(const Self & rhs) const { return t == rhs.t; } bool operator<(const Self & rhs) const { return t < rhs.t; }
T & toUnderType() { return t; } const T & toUnderType() const { return t; } };
#define STRONG_TYPEDEF(T, D) \ struct D ## Tag {}; \ using D = StrongTypedef<T, D ## Tag>; \
|
StrongTypedef
提供了T
的一种别名,它支持以下操作:
- 默认构造、复制/移动×构造/赋值。
T
到StrongTypedef
:复制/移动×构造/赋值。
StrongTypedef
到T
以及T
可以隐式转换的类型U
:隐式转换,toUnderType
。
关键是StrongTypedef
禁止了哪些操作:
(说实话我觉得StrongTypedef
不应该支持到T
的隐式转换,避免当T
是某种整数类型时无意的narrowing)