50 template <
class... Ts>
57 template <size_t,
class...>
59 template <
class T,
class... Rest>
63 template <
size_t N,
class T,
class... Rest>
67 template <
size_t N,
class... Types>
75 template <
class,
class...>
79 static constexpr size_t value = 0;
81 template <
class T,
class U,
class... Rest>
84 = std::is_same<typename std::decay<T>::type,
85 typename std::decay<U>::type>
::value;
99 template <
size_t N,
size_t... Ns>
113 = std::is_same<typename std::decay<T>::type,
void>
::value;
115 template <
class T,
class... Rest>
118 = std::is_same<typename std::decay<T>::type,
void>
::value
126 alignas(
max<
alignof(Ts)...>::value)
135 void (*
copier_)(
void *,
const void *) = [](
void *,
const void *) {};
137 void (*
mover_)(
void *,
void *) = [](
void *,
void *) {};
139 void (*
cctor_)(
void *,
const void *) = [](
void *,
const void *) {};
141 void (*
mctor_)(
void *,
void *) = [](
void *,
void *) {};
147#define TERMINATE_FOR_EXCEPTION(...) \
161 static_cast<T *
>(ptr)->~
T();
171 static inline void copier(
void *dest,
const void *src) {
172 if (dest == src)
return;
173 static_cast<T *
>(dest)->~
T();
184 static void mover(
void *dest,
void *src) {
185 if (dest == src)
return;
186 static_cast<T *
>(dest)->~
T();
188 new (dest)
T(std::move(*
static_cast<T *
>(src))));
198 static inline void cctor(
void *dest,
const void *src) {
209 static inline void mctor(
void *dest,
void *src) {
211 new (dest)
T(std::move(*
static_cast<T *
>(src))));
222 template <
size_t N,
class F,
class Ret>
223 typename std::enable_if<(
N <
sizeof...(Ts))>::type
231 template <
size_t N,
class F,
class Ret>
232 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
243 template <
size_t N,
class F,
class Ret>
244 typename std::enable_if<(
N <
sizeof...(Ts))>::type
252 template <
size_t N,
class F,
class Ret>
253 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
262 template <
size_t N,
class F>
263 typename std::enable_if<(
N <
sizeof...(Ts))>::type
_visit2(F &&f) {
270 template <
size_t N,
class F>
271 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
_visit2(F &&) {}
279 template <
size_t N,
class F>
280 typename std::enable_if<(
N <
sizeof...(Ts))>::type
288 template <
size_t N,
class F>
289 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
302 template <
size_t N,
class Ret,
class F,
class... Rest>
303 typename std::enable_if<(
N <
sizeof...(Ts))>::type
311 template <
size_t N,
class Ret,
class F,
class... Rest>
312 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
325 template <
size_t N,
class Ret,
class F,
class... Rest>
326 typename std::enable_if<(
N <
sizeof...(Ts))>::type
327 _visit3(Ret &r, F &&f, Rest &&...rest)
const {
334 template <
size_t N,
class Ret>
335 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
346 template <
size_t N,
class F,
class... Rest>
347 typename std::enable_if<(
N <
sizeof...(Ts))>::type
356 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
_visit4() {}
366 template <
size_t N,
class F,
class... Rest>
367 typename std::enable_if<(
N <
sizeof...(Ts))>::type
376 typename std::enable_if<(
N ==
sizeof...(Ts))>::type
_visit4()
const {}
392 class =
typename std::enable_if<
393 type_index<typename std::decay<T>::type, Ts...>::value
394 !=
sizeof...(Ts)>::type>
402 new (
data_)
typename std::decay<T>::type(std::forward<T>(value));
413 class =
typename std::enable_if<
414 type_index<typename std::decay<T>::type, Ts...>::value
415 !=
sizeof...(Ts)>::type>
419 typename std::decay<T>::type(std::forward<T>(value)));
449 other.index_ =
static_cast<size_t>(-1);
458 if (
this == &other)
return *
this;
478 if (
this == &other)
return *
this;
489 other.index_ =
static_cast<size_t>(-1);
501 ?
reinterpret_cast<T *
>(
data_)
513 ?
reinterpret_cast<const T *
>(
data_)
526 auto visit(F &&f) ->
typename std::enable_if<
528 typename std::common_type<
decltype(f(
529 std::declval<Ts &>()))...>::type>::type {
530 if (
empty()) std::terminate();
531 typename std::common_type<
532 decltype(f(std::declval<Ts &>()))...>::type result;
546 auto visit(F &&f)
const ->
typename std::enable_if<
548 typename std::common_type<
decltype(f(
549 std::declval<const Ts &>()))...>::type>::type {
550 if (
empty()) std::terminate();
551 typename std::common_type<
552 decltype(f(std::declval<const Ts &>()))...>::type result;
564 auto visit(F &&f) ->
typename std::enable_if<
566 if (
empty()) std::terminate();
577 auto visit(F &&f)
const ->
typename std::enable_if<
579 if (
empty()) std::terminate();
592 template <
class... Fs>
593 auto visit(Fs &&...fs) ->
typename std::enable_if<
595 typename std::common_type<
decltype(fs(
596 std::declval<Ts &>()))...>::type>::type {
597 static_assert(
sizeof...(Fs) ==
sizeof...(Ts),
598 "Number of functors does not match number of types!");
599 if (
empty()) std::terminate();
600 typename std::common_type<
601 decltype(fs(std::declval<Ts &>()))...>::type result;
615 template <
class... Fs>
616 auto visit(Fs &&...fs)
const ->
typename std::enable_if<
618 typename std::common_type<
decltype(fs(
619 std::declval<const Ts &>()))...>::type>::type {
620 static_assert(
sizeof...(Fs) ==
sizeof...(Ts),
621 "Number of functors does not match number of types!");
622 if (
empty()) std::terminate();
623 typename std::common_type<
624 decltype(fs(std::declval<const Ts &>()))...>::type result;
635 template <
class... Fs>
636 auto visit(Fs &&...fs) ->
typename std::enable_if<
638 static_assert(
sizeof...(Fs) ==
sizeof...(Ts),
639 "Number of functors does not match number of types!");
640 if (
empty()) std::terminate();
651 template <
class... Fs>
654 std::declval<const Ts &>()))...>::value>::type {
655 static_assert(
sizeof...(Fs) ==
sizeof...(Ts),
656 "Number of functors does not match number of types!");
657 if (
empty()) std::terminate();
674#undef TERMINATE_FOR_EXCEPTION
688 template <
class... Ts>
void(*) copier_(void *, const void *)
拷贝赋值函数指针。
Definition union.h:135
std::enable_if<(N==sizeof...(Ts))>::type _visit3(Ret &) const
Definition union.h:336
auto visit(F &&f) -> typename std::enable_if< has_void< decltype(f(std::declval< Ts & >()))... >::value >::type
使用单个函数对象访问存储的值 (无返回值版本,非 const)。
Definition union.h:564
std::enable_if<(N==sizeof...(Ts))>::type _visit4()
Definition union.h:356
std::enable_if<(N==sizeof...(Ts))>::type _visit2(F &&)
Definition union.h:271
std::enable_if<(N< sizeof...(Ts))>::type _visit1(F &&f, Ret &r)
访问者模式:单函数访问器 (有返回值版本,非 const)。
Definition union.h:224
const T * get() const
按类型获取存储的值的常量指针。
Definition union.h:511
std::enable_if<(N==sizeof...(Ts))>::type _visit1(F &&, Ret &)
Definition union.h:233
bool empty() const
检查 Union 是否为空。
Definition union.h:672
void(*) deleter_(void *)
析构函数指针。
Definition union.h:133
Union & operator=(Union &&other)
移动赋值运算符。
Definition union.h:477
std::enable_if<(N< sizeof...(Ts))>::type _visit4(F &&f, Rest &&...rest) const
访问者模式:多函数访问器 (无返回值版本,const)。
Definition union.h:368
~Union()
析构函数,销毁当前存储的值 (若有)。
Definition union.h:383
auto visit(Fs &&...fs) -> typename std::enable_if< has_void< decltype(fs(std::declval< Ts & >()))... >::value >::type
使用多个函数对象访问存储的值 (无返回值版本,非 const)。
Definition union.h:636
auto visit(F &&f) -> typename std::enable_if< !has_void< decltype(f(std::declval< Ts & >()))... >::value, typename std::common_type< decltype(f(std::declval< Ts & >()))... >::type >::type
使用单个函数对象访问存储的值 (有返回值版本,非 const)。
Definition union.h:526
std::enable_if<(N< sizeof...(Ts))>::type _visit1(F &&f, Ret &r) const
访问者模式:单函数访问器 (有返回值版本,const)。
Definition union.h:245
void(*) mctor_(void *, void *)
移动构造函数指针。
Definition union.h:141
friend class Union
Definition union.h:123
Union(T &&value)
从值构造 Union。
Definition union.h:395
char data_[max< sizeof(Ts)... >::value]
原始存储区,对齐到所有类型中最严格的要求。
Definition union.h:127
auto visit(F &&f) const -> typename std::enable_if< has_void< decltype(f(std::declval< const Ts & >()))... >::value >::type
使用单个函数对象访问存储的值 (无返回值版本,const)。
Definition union.h:577
size_t index_
当前存储类型的索引,-1 表示空。
Definition union.h:130
Union(const Union &other)
拷贝构造函数。
Definition union.h:433
auto visit(Fs &&...fs) const -> typename std::enable_if< has_void< decltype(fs(std::declval< const Ts & >()))... >::value >::type
使用多个函数对象访问存储的值 (无返回值版本,const)。
Definition union.h:653
Union(Union &&other)
移动构造函数。
Definition union.h:444
std::enable_if<(N==sizeof...(Ts))>::type _visit1(F &&, Ret &) const
Definition union.h:254
std::enable_if<(N< sizeof...(Ts))>::type _visit3(Ret &r, F &&f, Rest &&...rest) const
访问者模式:多函数访问器 (有返回值版本,const)。
Definition union.h:327
auto visit(F &&f) const -> typename std::enable_if< !has_void< decltype(f(std::declval< const Ts & >()))... >::value, typename std::common_type< decltype(f(std::declval< const Ts & >()))... >::type >::type
使用单个函数对象访问存储的值 (有返回值版本,const)。
Definition union.h:546
std::enable_if<(N==sizeof...(Ts))>::type _visit4() const
Definition union.h:376
auto visit(Fs &&...fs) const -> typename std::enable_if< !has_void< decltype(fs(std::declval< const Ts & >()))... >::value, typename std::common_type< decltype(fs(std::declval< const Ts & >()))... >::type >::type
使用多个函数对象访问存储的值 (有返回值版本,const)。
Definition union.h:616
typename type_at< N, Types... >::type type_at_t
Definition union.h:68
Union()=default
默认构造函数,构造一个空的 Union (不存储任何值)。
std::enable_if<(N< sizeof...(Ts))>::type _visit3(Ret &r, F &&f, Rest &&...rest)
访问者模式:多函数访问器 (有返回值版本,非 const)。
Definition union.h:304
auto visit(Fs &&...fs) -> typename std::enable_if< !has_void< decltype(fs(std::declval< Ts & >()))... >::value, typename std::common_type< decltype(fs(std::declval< Ts & >()))... >::type >::type
使用多个函数对象访问存储的值 (有返回值版本,非 const)。
Definition union.h:593
size_t index() const
获取当前存储类型的索引。
Definition union.h:665
void(*) mover_(void *, void *)
移动赋值函数指针。
Definition union.h:137
std::enable_if<(N==sizeof...(Ts))>::type _visit2(F &&) const
Definition union.h:290
std::enable_if<(N< sizeof...(Ts))>::type _visit2(F &&f)
访问者模式:单函数访问器 (无返回值版本,非 const)。
Definition union.h:263
std::enable_if<(N< sizeof...(Ts))>::type _visit2(F &&f) const
访问者模式:单函数访问器 (无返回值版本,const)。
Definition union.h:281
static void copier(void *dest, const void *src)
类型特定的拷贝赋值函数 (就地拷贝)。
Definition union.h:171
void(*) cctor_(void *, const void *)
拷贝构造函数指针。
Definition union.h:139
static void mover(void *dest, void *src)
类型特定的移动赋值函数 (就地移动)。
Definition union.h:184
static void mctor(void *dest, void *src)
类型特定的移动构造函数 (在未初始化的内存上构造)。
Definition union.h:209
T * get()
按类型获取存储的值的指针。
Definition union.h:499
Union & operator=(const Union &other)
拷贝赋值运算符。
Definition union.h:457
static void deleter(void *ptr)
类型特定的析构函数。
Definition union.h:160
static void cctor(void *dest, const void *src)
类型特定的拷贝构造函数 (在未初始化的内存上构造)。
Definition union.h:198
std::enable_if<(N< sizeof...(Ts))>::type _visit4(F &&f, Rest &&...rest)
访问者模式:多函数访问器 (无返回值版本,非 const)。
Definition union.h:348
std::enable_if<(N==sizeof...(Ts))>::type _visit3(Ret &, F &&, Rest &&...)
Definition union.h:313
static constexpr ignore_t ignore
全局 ignore 实例,可用于忽略任意参数。
Definition union.h:693
static const bool value
Definition union.h:118
static const bool value
Definition union.h:113
检查类型列表中是否包含 void。
Definition union.h:109
static constexpr size_t value
Definition union.h:102
static constexpr size_t value
Definition union.h:97
编译期计算一组 size_t 中的最大值。
Definition union.h:94
T type
Definition union.h:61
typename type_at< N - 1, Rest... >::type type
Definition union.h:65
在类型列表中按索引获取类型。
Definition union.h:58
static constexpr bool _is_match
Definition union.h:84
static constexpr size_t value
Definition union.h:87
static constexpr size_t _rest_index
Definition union.h:86
static constexpr size_t value
Definition union.h:79
获取类型 T 在类型列表中的索引。
Definition union.h:76
忽略任意参数的函数对象类型。
Definition union.h:682
void operator()(Ts &&...)
函数调用运算符,忽略所有参数。
Definition union.h:689
#define TERMINATE_FOR_EXCEPTION(...)
宏:在异常发生时调用 std::terminate。
Definition union.h:147