SimpleWindow
载入中...
搜索中...
未找到
sw::Variant类 参考final

通用变体类型容器,类型擦除地持有任意类型对象 更多...

#include <Variant.h>

Public 成员函数

 Variant ()=default
 默认构造函数,创建一个空的Variant对象
 
 Variant (std::nullptr_t) noexcept
 从nullptr构造一个空的Variant对象
 
 Variant (ObjectRef ref)
 以引用语义构造Variant
 
template<typename T , typename std::enable_if<!std::is_same< Variant, typename std::decay< T >::type >::value, int >::type = 0>
 Variant (T &&obj)
 通用构造函数,接受任意类型的对象(值语义)
 
 Variant (const Variant &other)
 拷贝构造函数
 
 Variant (Variant &&other) noexcept
 移动构造函数
 
Variantoperator= (const Variant &other)
 拷贝赋值运算符
 
Variantoperator= (Variant &&other) noexcept
 移动赋值运算符
 
 operator bool () const noexcept
 布尔转换运算符,判断Variant对象是否为空
 
bool IsNull () const noexcept
 判断Variant对象是否为空
 
bool HasValue () const noexcept
 判断Variant对象是否包含值
 
bool ReferenceEquals (const Variant &other) const noexcept
 判断两Variant是否引用同一对象(指针身份比较)
 
void Reset () noexcept
 重置Variant对象为空
 
void Reset (std::nullptr_t) noexcept
 重置Variant对象为空
 
void Reset (ObjectRef ref)
 重置Variant对象为指定的引用标记
 
void Reset (const Variant &other)
 重置Variant对象为另一个Variant对象的值
 
void Reset (Variant &&other) noexcept
 重置Variant对象为另一个Variant对象的值
 
template<typename T >
auto Reset (T &&obj) -> typename std::enable_if< !std::is_same< Variant, typename std::decay< T >::type >::value &&std::is_base_of< DynamicObject, typename std::decay< T >::type >::value >::type
 重置Variant对象为指定类型的对象
 
template<typename T >
auto Reset (T &&obj) -> typename std::enable_if< !std::is_same< Variant, typename std::decay< T >::type >::value &&!std::is_base_of< DynamicObject, typename std::decay< T >::type >::value >::type
 重置Variant对象为指定类型的对象
 
DynamicObjectObject () noexcept
 获取内部动态对象指针
 
const DynamicObjectObject () const noexcept
 获取内部动态对象的常量指针
 
std::type_index GetType () const
 获取内部对象的类型信息
 
template<typename T >
bool IsType (T **pout=nullptr)
 判断当前Variant存储的对象是否为指定类型
 
template<typename T >
bool IsType (const T **pout=nullptr) const
 判断当前Variant存储的对象是否为指定类型
 
template<typename T >
TDynamicCast ()
 将Variant对象动态转换为指定类型的引用
 
template<typename T >
const TDynamicCast () const
 将Variant对象动态转换为指定类型的常量引用
 
template<typename T >
TUnsafeCast ()
 将Variant对象转换为指定类型的引用
 
template<typename T >
const TUnsafeCast () const
 将Variant对象转换为指定类型的常量引用
 

静态 Public 成员函数

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]

sw::Variant::Variant ( ObjectRef  ref)
inline

以引用语义构造Variant

参数
ref引用标记
注解
与Variant::MakeRef等价的低层入口,内部以装箱的ObjectRef表示。 使用方需保证被引用对象在Variant存活期间始终有效。
若ref.ptr为nullptr则构造为空Variant,行为与Variant(std::nullptr_t)一致。

◆ Variant() [2/3]

template<typename T , typename std::enable_if<!std::is_same< Variant, typename std::decay< T >::type >::value, int >::type = 0>
sw::Variant::Variant ( T &&  obj)
inline

通用构造函数,接受任意类型的对象(值语义)

警告
若T为基类引用且实际指向派生对象,会发生对象切片; 如需保留对外部对象的引用语义,请改用Variant::MakeRef<T>。

◆ Variant() [3/3]

sw::Variant::Variant ( const Variant other)
inline

拷贝构造函数

异常
std::runtime_error如果对象不可拷贝

成员函数说明

◆ DynamicCast() [1/2]

template<typename T >
T & sw::Variant::DynamicCast ( )
inline

将Variant对象动态转换为指定类型的引用

模板参数
T目标类型
返回
指定类型的引用
异常
std::bad_cast如果转换失败或Variant为空
注解
对引用语义的Variant会自动透视到被引用对象。

◆ DynamicCast() [2/2]

template<typename T >
const T & sw::Variant::DynamicCast ( ) const
inline

将Variant对象动态转换为指定类型的常量引用

模板参数
T目标类型
返回
指定类型的常量引用
异常
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]

template<typename T >
bool sw::Variant::IsType ( const T **  pout = nullptr) const
inline

判断当前Variant存储的对象是否为指定类型

模板参数
T目标类型
参数
pout如果不为nullptr,则将转换后的指针赋值给该参数
返回
如果Variant对象为指定类型则返回true,否则返回false
注解
对引用语义的Variant会自动透视到被引用对象,调用方无需关心存储形式。

◆ IsType() [2/2]

template<typename T >
bool sw::Variant::IsType ( T **  pout = nullptr)
inline

判断当前Variant存储的对象是否为指定类型

模板参数
T目标类型
参数
pout如果不为nullptr,则将转换后的指针赋值给该参数
返回
如果Variant对象为指定类型则返回true,否则返回false
注解
对引用语义的Variant会自动透视到被引用对象,调用方无需关心存储形式。

◆ MakeRef() [1/3]

template<typename T >
static auto sw::Variant::MakeRef ( T obj) -> typename std::enable_if< !std::is_same<T, Variant>::value && !std::is_base_of<DynamicObject, T>::value, Variant>::type
inlinestatic

创建一个对外部对象的引用Variant(非DynamicObject类型重载)

模板参数
T被引用的对象类型
参数
obj被引用的对象
返回
一个引用语义的Variant,与obj共享生命周期
注解
内部以引用模式的BoxedObject<T>表示。 使用方需保证obj在Variant存活期间始终有效。

◆ MakeRef() [2/3]

template<typename T >
static auto sw::Variant::MakeRef ( T obj) -> typename std::enable_if< !std::is_same<T, Variant>::value && std::is_base_of<DynamicObject, T>::value, Variant>::type
inlinestatic

创建一个对外部对象的引用Variant(DynamicObject派生类型重载)

模板参数
T被引用的对象类型,必须为DynamicObject的派生类
参数
obj被引用的对象
返回
一个引用语义的Variant,与obj共享生命周期
注解
内部以装箱的ObjectRef表示,Variant的类型查询接口对此透明。 使用方需保证obj在Variant存活期间始终有效。

◆ MakeRef() [3/3]

static Variant sw::Variant::MakeRef ( Variant v)
inlinestatic

创建一个对另一Variant内部对象的引用Variant(Variant转发重载)

参数
v源Variant
返回
一个引用语义的Variant,引用v当前承载的对象;若v为空则返回空Variant
注解
避免对Variant调用泛型MakeRef时产生BoxedObject<Variant>嵌套包装。 结果直接引用v.Object()返回的指针,因此当v本身已是引用语义时, 结果与v共享同一被引用对象,不会形成多层引用链。

◆ MakeVal() [1/2]

template<typename T , typename... Args>
static auto sw::Variant::MakeVal ( Args &&...  args) -> typename std::enable_if< !std::is_same<T, Variant>::value && !std::is_base_of<DynamicObject, T>::value, Variant>::type
inlinestatic

就地构造一个值语义的Variant(非DynamicObject类型重载)

模板参数
T要构造的对象类型
Args构造参数类型包
参数
args转发给T构造函数的参数
返回
持有就地装箱构造的T对象的Variant
注解
相较于Variant{T{args...}},避免了一次T的移动构造, 且支持不可移动/不可拷贝但可构造的类型。

◆ MakeVal() [2/2]

template<typename T , typename... Args>
static auto sw::Variant::MakeVal ( Args &&...  args) -> typename std::enable_if< !std::is_same<T, Variant>::value && std::is_base_of<DynamicObject, T>::value, Variant>::type
inlinestatic

就地构造一个值语义的Variant(DynamicObject派生类型重载)

模板参数
T要构造的对象类型,必须为DynamicObject的派生类
Args构造参数类型包
参数
args转发给T构造函数的参数
返回
持有就地构造的T对象的Variant
注解
相较于Variant{T{args...}},避免了一次T的移动构造, 且支持不可移动/不可拷贝但可构造的类型。

◆ Object() [1/2]

const DynamicObject * sw::Variant::Object ( ) const
inlinenoexcept

获取内部动态对象的常量指针

返回
内部动态对象的常量指针,若Variant为空则返回nullptr
注解
若Variant以引用语义持有DynamicObject(即装箱的ObjectRef), 返回被引用对象的指针;否则返回内部对象指针。

◆ Object() [2/2]

DynamicObject * sw::Variant::Object ( )
inlinenoexcept

获取内部动态对象指针

返回
内部动态对象指针,若Variant为空则返回nullptr
注解
若Variant以引用语义持有DynamicObject(即装箱的ObjectRef), 返回被引用对象的指针;否则返回内部对象指针。

◆ operator bool()

sw::Variant::operator bool ( ) const
inlineexplicitnoexcept

布尔转换运算符,判断Variant对象是否为空

返回
若Variant对象不为空则返回true,否则返回false

◆ operator=()

Variant & sw::Variant::operator= ( const Variant other)
inline

拷贝赋值运算符

异常
std::runtime_error如果对象不可拷贝

◆ ReferenceEquals()

bool sw::Variant::ReferenceEquals ( const Variant other) const
inlinenoexcept

判断两Variant是否引用同一对象(指针身份比较)

返回
若两Variant的有效对象指针相同(含都为空)则返回true,否则返回false
注解
这是引用相等而非值相等。比较的是Object()返回的指针,因此引用语义的 Variant与持有同一原始对象的Variant会被视为相等。若需值相等比较, 请通过Object()或DynamicCast<T>()获取内部对象后自行比较。

◆ Reset() [1/4]

void sw::Variant::Reset ( const Variant other)
inline

重置Variant对象为另一个Variant对象的值

异常
std::runtime_error如果对象不可拷贝

◆ Reset() [2/4]

void sw::Variant::Reset ( ObjectRef  ref)
inline

重置Variant对象为指定的引用标记

参数
ref引用标记
注解
内部以装箱的ObjectRef表示,使Variant以引用语义持有DynamicObject。 使用方需保证被引用对象在Variant存活期间始终有效。
若ref.ptr为nullptr则置为空Variant,行为与Reset(std::nullptr_t)一致。

◆ Reset() [3/4]

template<typename T >
auto sw::Variant::Reset ( T &&  obj) -> typename std::enable_if< !std::is_same<Variant, typename std::decay<T>::type>::value && !std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
inline

重置Variant对象为指定类型的对象

模板参数
T对象类型
参数
obj对象

◆ Reset() [4/4]

template<typename T >
auto sw::Variant::Reset ( T &&  obj) -> typename std::enable_if< !std::is_same<Variant, typename std::decay<T>::type>::value && std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
inline

重置Variant对象为指定类型的对象

模板参数
T对象类型
参数
obj对象

◆ UnsafeCast() [1/2]

template<typename T >
T & sw::Variant::UnsafeCast ( )
inline

将Variant对象转换为指定类型的引用

模板参数
T目标类型
返回
指定类型的引用
异常
std::bad_cast如果Variant为空
注解
若目标类型与存储类型不匹配,则行为未定义
对引用语义的Variant会自动透视到被引用对象。

◆ UnsafeCast() [2/2]

template<typename T >
const T & sw::Variant::UnsafeCast ( ) const
inline

将Variant对象转换为指定类型的常量引用

模板参数
T目标类型
返回
指定类型的常量引用
异常
std::bad_cast如果Variant为空
注解
若目标类型与存储类型不匹配,则行为未定义
对引用语义的Variant会自动透视到被引用对象。

该类的文档由以下文件生成: