通用变体类型容器,类型擦除地持有任意类型对象
更多...
#include <Variant.h>
|
| template<typename T , typename... Args> |
| static auto | MakeVal (Args &&...args) -> typename std::enable_if< !std::is_same< T, Variant >::value &&std::is_base_of< DynamicObject, T >::value, Variant >::type |
| | 就地构造一个值语义的Variant(DynamicObject派生类型重载)
|
| |
| template<typename T , typename... Args> |
| static auto | MakeVal (Args &&...args) -> typename std::enable_if< !std::is_same< T, Variant >::value &&!std::is_base_of< DynamicObject, T >::value, Variant >::type |
| | 就地构造一个值语义的Variant(非DynamicObject类型重载)
|
| |
| static Variant | MakeRef (Variant &v) |
| | 创建一个对另一Variant内部对象的引用Variant(Variant转发重载)
|
| |
| template<typename T > |
| static auto | MakeRef (T &obj) -> typename std::enable_if< !std::is_same< T, Variant >::value &&std::is_base_of< DynamicObject, T >::value, Variant >::type |
| | 创建一个对外部对象的引用Variant(DynamicObject派生类型重载)
|
| |
| template<typename T > |
| static auto | MakeRef (T &obj) -> typename std::enable_if< !std::is_same< T, Variant >::value &&!std::is_base_of< DynamicObject, T >::value, Variant >::type |
| | 创建一个对外部对象的引用Variant(非DynamicObject类型重载)
|
| |
通用变体类型容器,类型擦除地持有任意类型对象
- 注解
- Variant自身是原生C++值类型,而非DynamicObject派生类。 它可持有任意类型对象 —— 既包括DynamicObject派生类型,也包括原生C++类型。 内部按持入类型与语义自动选择存储策略:
- 值语义 + DynamicObject派生类型:直接以unique_ptr<DynamicObject>持有;
- 值语义 + 其他原生C++类型:装箱为BoxedObject<T>持有;
- 引用语义 + DynamicObject派生类型:装箱为BoxedObject<ObjectRef>持有;
- 引用语义 + 其他原生C++类型:装箱为引用模式的BoxedObject<T>持有; 这些差异对Object()/IsType/DynamicCast/UnsafeCast等查询接口透明。
-
默认为值语义(拷贝/赋值会通过克隆函数指针深拷贝内部对象); 通过Variant::MakeRef或显式构造ObjectRef可获得引用语义。
-
持入Variant的类型其析构函数不应抛出异常 —— C++11起析构函数默认即为 noexcept,Variant的多个noexcept移动操作依赖此前提。
◆ Variant() [1/3]
以引用语义构造Variant
- 参数
-
- 注解
- 与Variant::MakeRef等价的低层入口,内部以装箱的ObjectRef表示。 使用方需保证被引用对象在Variant存活期间始终有效。
-
若ref.ptr为nullptr则构造为空Variant,行为与Variant(std::nullptr_t)一致。
◆ Variant() [2/3]
| sw::Variant::Variant |
( |
T && |
obj | ) |
|
|
inline |
通用构造函数,接受任意类型的对象(值语义)
- 警告
- 若T为基类引用且实际指向派生对象,会发生对象切片; 如需保留对外部对象的引用语义,请改用Variant::MakeRef<T>。
◆ Variant() [3/3]
拷贝构造函数
- 异常
-
| std::runtime_error | 如果对象不可拷贝 |
◆ DynamicCast() [1/2]
| T & sw::Variant::DynamicCast |
( |
| ) |
|
|
inline |
将Variant对象动态转换为指定类型的引用
- 模板参数
-
- 返回
- 指定类型的引用
- 异常
-
| std::bad_cast | 如果转换失败或Variant为空 |
- 注解
- 对引用语义的Variant会自动透视到被引用对象。
◆ DynamicCast() [2/2]
| const T & sw::Variant::DynamicCast |
( |
| ) |
const |
|
inline |
将Variant对象动态转换为指定类型的常量引用
- 模板参数
-
- 返回
- 指定类型的常量引用
- 异常
-
| std::bad_cast | 如果转换失败或Variant为空 |
- 注解
- 对引用语义的Variant会自动透视到被引用对象。
◆ GetType()
| std::type_index sw::Variant::GetType |
( |
| ) |
const |
|
inline |
获取内部对象的类型信息
- 返回
- 内部对象的类型索引;若Variant为空则返回typeid(void)
- 注解
- 语义与DynamicObject::GetType一致 —— 返回内部对象的最派生类型。 对引用语义的Variant会自动透视到被引用对象。
◆ HasValue()
| bool sw::Variant::HasValue |
( |
| ) |
const |
|
inlinenoexcept |
判断Variant对象是否包含值
- 返回
- 若Variant对象不为空则返回true,否则返回false
◆ IsNull()
| bool sw::Variant::IsNull |
( |
| ) |
const |
|
inlinenoexcept |
判断Variant对象是否为空
- 返回
- 若Variant对象为空则返回true,否则返回false
◆ IsType() [1/2]
判断当前Variant存储的对象是否为指定类型
- 模板参数
-
- 参数
-
| pout | 如果不为nullptr,则将转换后的指针赋值给该参数 |
- 返回
- 如果Variant对象为指定类型则返回true,否则返回false
- 注解
- 对引用语义的Variant会自动透视到被引用对象,调用方无需关心存储形式。
◆ IsType() [2/2]
判断当前Variant存储的对象是否为指定类型
- 模板参数
-
- 参数
-
| pout | 如果不为nullptr,则将转换后的指针赋值给该参数 |
- 返回
- 如果Variant对象为指定类型则返回true,否则返回false
- 注解
- 对引用语义的Variant会自动透视到被引用对象,调用方无需关心存储形式。
◆ MakeRef() [1/3]
创建一个对外部对象的引用Variant(非DynamicObject类型重载)
- 模板参数
-
- 参数
-
- 返回
- 一个引用语义的Variant,与obj共享生命周期
- 注解
- 内部以引用模式的BoxedObject<T>表示。 使用方需保证obj在Variant存活期间始终有效。
◆ MakeRef() [2/3]
创建一个对外部对象的引用Variant(DynamicObject派生类型重载)
- 模板参数
-
| T | 被引用的对象类型,必须为DynamicObject的派生类 |
- 参数
-
- 返回
- 一个引用语义的Variant,与obj共享生命周期
- 注解
- 内部以装箱的ObjectRef表示,Variant的类型查询接口对此透明。 使用方需保证obj在Variant存活期间始终有效。
◆ MakeRef() [3/3]
创建一个对另一Variant内部对象的引用Variant(Variant转发重载)
- 参数
-
- 返回
- 一个引用语义的Variant,引用v当前承载的对象;若v为空则返回空Variant
- 注解
- 避免对Variant调用泛型MakeRef时产生BoxedObject<Variant>嵌套包装。 结果直接引用v.Object()返回的指针,因此当v本身已是引用语义时, 结果与v共享同一被引用对象,不会形成多层引用链。
◆ MakeVal() [1/2]
就地构造一个值语义的Variant(非DynamicObject类型重载)
- 模板参数
-
- 参数
-
- 返回
- 持有就地装箱构造的T对象的Variant
- 注解
- 相较于Variant{T{args...}},避免了一次T的移动构造, 且支持不可移动/不可拷贝但可构造的类型。
◆ MakeVal() [2/2]
就地构造一个值语义的Variant(DynamicObject派生类型重载)
- 模板参数
-
| T | 要构造的对象类型,必须为DynamicObject的派生类 |
| Args | 构造参数类型包 |
- 参数
-
- 返回
- 持有就地构造的T对象的Variant
- 注解
- 相较于Variant{T{args...}},避免了一次T的移动构造, 且支持不可移动/不可拷贝但可构造的类型。
◆ Object() [1/2]
获取内部动态对象的常量指针
- 返回
- 内部动态对象的常量指针,若Variant为空则返回nullptr
- 注解
- 若Variant以引用语义持有DynamicObject(即装箱的ObjectRef), 返回被引用对象的指针;否则返回内部对象指针。
◆ Object() [2/2]
获取内部动态对象指针
- 返回
- 内部动态对象指针,若Variant为空则返回nullptr
- 注解
- 若Variant以引用语义持有DynamicObject(即装箱的ObjectRef), 返回被引用对象的指针;否则返回内部对象指针。
◆ operator bool()
| sw::Variant::operator bool |
( |
| ) |
const |
|
inlineexplicitnoexcept |
布尔转换运算符,判断Variant对象是否为空
- 返回
- 若Variant对象不为空则返回true,否则返回false
◆ operator=()
拷贝赋值运算符
- 异常
-
| std::runtime_error | 如果对象不可拷贝 |
◆ ReferenceEquals()
判断两Variant是否引用同一对象(指针身份比较)
- 返回
- 若两Variant的有效对象指针相同(含都为空)则返回true,否则返回false
- 注解
- 这是引用相等而非值相等。比较的是Object()返回的指针,因此引用语义的 Variant与持有同一原始对象的Variant会被视为相等。若需值相等比较, 请通过Object()或DynamicCast<T>()获取内部对象后自行比较。
◆ Reset() [1/4]
重置Variant对象为另一个Variant对象的值
- 异常
-
| std::runtime_error | 如果对象不可拷贝 |
◆ Reset() [2/4]
重置Variant对象为指定的引用标记
- 参数
-
- 注解
- 内部以装箱的ObjectRef表示,使Variant以引用语义持有DynamicObject。 使用方需保证被引用对象在Variant存活期间始终有效。
-
若ref.ptr为nullptr则置为空Variant,行为与Reset(std::nullptr_t)一致。
◆ Reset() [3/4]
重置Variant对象为指定类型的对象
- 模板参数
-
- 参数
-
◆ Reset() [4/4]
重置Variant对象为指定类型的对象
- 模板参数
-
- 参数
-
◆ UnsafeCast() [1/2]
| T & sw::Variant::UnsafeCast |
( |
| ) |
|
|
inline |
将Variant对象转换为指定类型的引用
- 模板参数
-
- 返回
- 指定类型的引用
- 异常
-
- 注解
- 若目标类型与存储类型不匹配,则行为未定义
-
对引用语义的Variant会自动透视到被引用对象。
◆ UnsafeCast() [2/2]
| const T & sw::Variant::UnsafeCast |
( |
| ) |
const |
|
inline |
将Variant对象转换为指定类型的常量引用
- 模板参数
-
- 返回
- 指定类型的常量引用
- 异常
-
- 注解
- 若目标类型与存储类型不匹配,则行为未定义
-
对引用语义的Variant会自动透视到被引用对象。
该类的文档由以下文件生成: