|
Console Library 8.0.0
A header-only library that makes C++ simple
|
类型安全的可判别联合体。 More...
#include <union.h>
Classes | |
| struct | type_at |
| 在类型列表中按索引获取类型。 More... | |
| struct | type_at< 0, T, Rest... > |
| struct | type_at< N, T, Rest... > |
| struct | type_index |
| 获取类型 T 在类型列表中的索引。 More... | |
| struct | type_index< T > |
| struct | type_index< T, U, Rest... > |
| struct | max |
| 编译期计算一组 size_t 中的最大值。 More... | |
| struct | max< N > |
| struct | max< N, Ns... > |
| struct | has_void |
| 检查类型列表中是否包含 void。 More... | |
| struct | has_void< T > |
| struct | has_void< T, Rest... > |
Public Member Functions | |
| Union ()=default | |
| 默认构造函数,构造一个空的 Union (不存储任何值)。 | |
| ~Union () | |
| 析构函数,销毁当前存储的值 (若有)。 | |
| template<class T, class = typename std::enable_if< type_index<typename std::decay<T>::type, Ts...>::value != sizeof...(Ts)>::type> | |
| Union (T &&value) | |
| 从值构造 Union。 | |
| template<class T, class = typename std::enable_if< type_index<typename std::decay<T>::type, Ts...>::value != sizeof...(Ts)>::type> | |
| Union & | operator= (T &&value) |
| 赋值运算符,从值赋值。 | |
| Union (const Union &other) | |
| 拷贝构造函数。 | |
| Union (Union &&other) | |
| 移动构造函数。 | |
| Union & | operator= (const Union &other) |
| 拷贝赋值运算符。 | |
| Union & | operator= (Union &&other) |
| 移动赋值运算符。 | |
| template<class T> | |
| T * | get () |
| 按类型获取存储的值的指针。 | |
| template<class T> | |
| const T * | get () const |
| 按类型获取存储的值的常量指针。 | |
| template<class F> | |
| 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)。 | |
| template<class F> | |
| 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)。 | |
| template<class F> | |
| auto | visit (F &&f) -> typename std::enable_if< has_void< decltype(f(std::declval< Ts & >()))... >::value >::type |
| 使用单个函数对象访问存储的值 (无返回值版本,非 const)。 | |
| template<class F> | |
| auto | visit (F &&f) const -> typename std::enable_if< has_void< decltype(f(std::declval< const Ts & >()))... >::value >::type |
| 使用单个函数对象访问存储的值 (无返回值版本,const)。 | |
| template<class... Fs> | |
| 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)。 | |
| template<class... Fs> | |
| 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)。 | |
| template<class... Fs> | |
| auto | visit (Fs &&...fs) -> typename std::enable_if< has_void< decltype(fs(std::declval< Ts & >()))... >::value >::type |
| 使用多个函数对象访问存储的值 (无返回值版本,非 const)。 | |
| template<class... Fs> | |
| auto | visit (Fs &&...fs) const -> typename std::enable_if< has_void< decltype(fs(std::declval< const Ts & >()))... >::value >::type |
| 使用多个函数对象访问存储的值 (无返回值版本,const)。 | |
| size_t | index () const |
| 获取当前存储类型的索引。 | |
| bool | empty () const |
| 检查 Union 是否为空。 | |
Private Types | |
| template<size_t N, class... Types> | |
| using | type_at_t = typename type_at<N, Types...>::type |
Private Member Functions | |
| template<size_t N, class F, class Ret> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit1 (F &&f, Ret &r) |
| 访问者模式:单函数访问器 (有返回值版本,非 const)。 | |
| template<size_t N, class F, class Ret> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit1 (F &&, Ret &) |
| template<size_t N, class F, class Ret> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit1 (F &&f, Ret &r) const |
| 访问者模式:单函数访问器 (有返回值版本,const)。 | |
| template<size_t N, class F, class Ret> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit1 (F &&, Ret &) const |
| template<size_t N, class F> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit2 (F &&f) |
| 访问者模式:单函数访问器 (无返回值版本,非 const)。 | |
| template<size_t N, class F> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit2 (F &&) |
| template<size_t N, class F> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit2 (F &&f) const |
| 访问者模式:单函数访问器 (无返回值版本,const)。 | |
| template<size_t N, class F> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit2 (F &&) const |
| template<size_t N, class Ret, class F, class... Rest> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit3 (Ret &r, F &&f, Rest &&...rest) |
| 访问者模式:多函数访问器 (有返回值版本,非 const)。 | |
| template<size_t N, class Ret, class F, class... Rest> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit3 (Ret &, F &&, Rest &&...) |
| template<size_t N, class Ret, class F, class... Rest> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit3 (Ret &r, F &&f, Rest &&...rest) const |
| 访问者模式:多函数访问器 (有返回值版本,const)。 | |
| template<size_t N, class Ret> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit3 (Ret &) const |
| template<size_t N, class F, class... Rest> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit4 (F &&f, Rest &&...rest) |
| 访问者模式:多函数访问器 (无返回值版本,非 const)。 | |
| template<size_t N> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit4 () |
| template<size_t N, class F, class... Rest> | |
| std::enable_if<(N< sizeof...(Ts))>::type | _visit4 (F &&f, Rest &&...rest) const |
| 访问者模式:多函数访问器 (无返回值版本,const)。 | |
| template<size_t N> | |
| std::enable_if<(N==sizeof...(Ts))>::type | _visit4 () const |
Static Private Member Functions | |
| template<class T> | |
| static void | deleter (void *ptr) |
| 类型特定的析构函数。 | |
| template<class T> | |
| static void | copier (void *dest, const void *src) |
| 类型特定的拷贝赋值函数 (就地拷贝)。 | |
| template<class T> | |
| static void | mover (void *dest, void *src) |
| 类型特定的移动赋值函数 (就地移动)。 | |
| template<class T> | |
| static void | cctor (void *dest, const void *src) |
| 类型特定的拷贝构造函数 (在未初始化的内存上构造)。 | |
| template<class T> | |
| static void | mctor (void *dest, void *src) |
| 类型特定的移动构造函数 (在未初始化的内存上构造)。 | |
Private Attributes | |
| char | data_ [max< sizeof(Ts)... >::value] |
| 原始存储区,对齐到所有类型中最严格的要求。 | |
| size_t | index_ {static_cast<size_t>(-1)} |
| 当前存储类型的索引,-1 表示空。 | |
| void(*) | deleter_ (void *) = [](void *) {} |
| 析构函数指针。 | |
| void(*) | copier_ (void *, const void *) = [](void *, const void *) {} |
| 拷贝赋值函数指针。 | |
| void(*) | mover_ (void *, void *) = [](void *, void *) {} |
| 移动赋值函数指针。 | |
| void(*) | cctor_ (void *, const void *) = [](void *, const void *) {} |
| 拷贝构造函数指针。 | |
| void(*) | mctor_ (void *, void *) = [](void *, void *) {} |
| 移动构造函数指针。 | |
Friends | |
| template<class...> | |
| class | Union |
类型安全的可判别联合体。
类似于 std::variant,但实现方式更底层。 在任何时刻,Union 要么为空 (默认构造后),要么存储 Ts... 中某一类型的值。 所有操作均基于函数指针表实现,以减小代码体积。
| Ts | 允许存储的类型列表,不能包含重复类型或 void (除非作为唯一类型)。 |
|
private |
|
default |
默认构造函数,构造一个空的 Union (不存储任何值)。
|
inline |
析构函数,销毁当前存储的值 (若有)。
|
inline |
从值构造 Union。
| T | 值的类型,必须是 Ts... 中的一种。 |
| value | 要存储的值。 |
|
inline |
拷贝构造函数。
| other | 要拷贝的 Union。 |
|
inline |
移动构造函数。
| other | 要移动的 Union。 |
|
inlineprivate |
|
inlineprivate |
|
inlineprivate |
访问者模式:单函数访问器 (有返回值版本,非 const)。
| N | 当前递归索引。 |
| F | 函数对象类型。 |
| Ret | 返回值类型。 |
| f | 函数对象。 |
| r | 用于存储返回值的引用。 |
|
inlineprivate |
访问者模式:单函数访问器 (有返回值版本,const)。
| N | 当前递归索引。 |
| F | 函数对象类型。 |
| Ret | 返回值类型。 |
| f | 函数对象。 |
| r | 用于存储返回值的引用。 |
|
inlineprivate |
|
inlineprivate |
|
inlineprivate |
访问者模式:单函数访问器 (无返回值版本,非 const)。
| N | 当前递归索引。 |
| F | 函数对象类型。 |
| f | 函数对象。 |
|
inlineprivate |
访问者模式:单函数访问器 (无返回值版本,const)。
| N | 当前递归索引。 |
| F | 函数对象类型。 |
| f | 函数对象。 |
|
inlineprivate |
|
inlineprivate |
|
inlineprivate |
访问者模式:多函数访问器 (有返回值版本,非 const)。
| N | 当前递归索引。 |
| Ret | 返回值类型。 |
| F | 第一个函数对象类型。 |
| Rest | 其余函数对象类型。 |
| r | 用于存储返回值的引用。 |
| f | 当前索引对应的函数对象。 |
| rest | 其余函数对象。 |
|
inlineprivate |
访问者模式:多函数访问器 (有返回值版本,const)。
| N | 当前递归索引。 |
| Ret | 返回值类型。 |
| F | 第一个函数对象类型。 |
| Rest | 其余函数对象类型。 |
| r | 用于存储返回值的引用。 |
| f | 当前索引对应的函数对象。 |
| rest | 其余函数对象。 |
|
inlineprivate |
|
inlineprivate |
|
inlineprivate |
访问者模式:多函数访问器 (无返回值版本,非 const)。
| N | 当前递归索引。 |
| F | 第一个函数对象类型。 |
| Rest | 其余函数对象类型。 |
| f | 当前索引对应的函数对象。 |
| rest | 其余函数对象。 |
|
inlineprivate |
访问者模式:多函数访问器 (无返回值版本,const)。
| N | 当前递归索引。 |
| F | 第一个函数对象类型。 |
| Rest | 其余函数对象类型。 |
| f | 当前索引对应的函数对象。 |
| rest | 其余函数对象。 |
|
inlinestaticprivate |
类型特定的拷贝构造函数 (在未初始化的内存上构造)。
| T | 当前存储的类型。 |
| dest | 目标指针 (未初始化)。 |
| src | 源指针 (已初始化)。 |
|
inlinestaticprivate |
类型特定的拷贝赋值函数 (就地拷贝)。
| T | 当前存储的类型。 |
| dest | 目标指针。 |
| src | 源指针。 |
|
inlinestaticprivate |
类型特定的析构函数。
| T | 当前存储的类型。 |
| ptr | 指向对象的指针。 |
|
inline |
按类型获取存储的值的指针。
| T | 要获取的类型。 |
按类型获取存储的值的常量指针。
| T | 要获取的类型。 |
|
inline |
获取当前存储类型的索引。
|
inlinestaticprivate |
类型特定的移动构造函数 (在未初始化的内存上构造)。
| T | 当前存储的类型。 |
| dest | 目标指针 (未初始化)。 |
| src | 源指针 (已初始化)。 |
|
inlinestaticprivate |
类型特定的移动赋值函数 (就地移动)。
| T | 当前存储的类型。 |
| dest | 目标指针。 |
| src | 源指针。 |
|
inline |
|
inline |
赋值运算符,从值赋值。
| T | 值的类型,必须是 Ts... 中的一种。 |
| value | 要存储的值。 |
|
inline |
|
inline |
使用单个函数对象访问存储的值 (有返回值版本,非 const)。
| F | 函数对象类型,必须能接受 Ts... 中的任意类型作为参数。 |
| f | 函数对象。 |
|
inline |
使用单个函数对象访问存储的值 (无返回值版本,非 const)。
| F | 函数对象类型,必须能接受 Ts... 中的任意类型作为参数,且任一重载返回 void。 |
| f | 函数对象。 |
|
inline |
使用单个函数对象访问存储的值 (有返回值版本,const)。
| F | 函数对象类型,必须能接受 Ts... 中的任意类型作为参数。 |
| f | 函数对象。 |
|
inline |
使用单个函数对象访问存储的值 (无返回值版本,const)。
| F | 函数对象类型,必须能接受 Ts... 中的任意类型作为参数,且任一重载返回 void。 |
| f | 函数对象。 |
|
inline |
使用多个函数对象访问存储的值 (有返回值版本,非 const)。
每个类型对应一个函数对象,按索引匹配。
| Fs | 函数对象类型列表,数量必须与 Ts... 一致。 |
| fs | 函数对象列表。 |
|
inline |
使用多个函数对象访问存储的值 (无返回值版本,非 const)。
每个类型对应一个函数对象,按索引匹配。
| Fs | 函数对象类型列表,数量必须与 Ts... 一致,且任一重载返回 void。 |
| fs | 函数对象列表。 |
|
inline |
使用多个函数对象访问存储的值 (有返回值版本,const)。
每个类型对应一个函数对象,按索引匹配。
| Fs | 函数对象类型列表,数量必须与 Ts... 一致。 |
| fs | 函数对象列表。 |
|
inline |
使用多个函数对象访问存储的值 (无返回值版本,const)。
每个类型对应一个函数对象,按索引匹配。
| Fs | 函数对象类型列表,数量必须与 Ts... 一致,且任一重载返回 void。 |
| fs | 函数对象列表。 |
|
friend |
|
private |
拷贝构造函数指针。
|
private |
拷贝赋值函数指针。
|
private |
原始存储区,对齐到所有类型中最严格的要求。
|
private |
析构函数指针。
|
private |
当前存储类型的索引,-1 表示空。
|
private |
移动构造函数指针。
|
private |
移动赋值函数指针。