我试图实现一个对象持有者(类似于boost::any
),其附加功能是可以使用基类类型访问对象。我理解这不可能简单地使用boost::any
类,因为在访问它时,任何时候都需要知道对象的精确类型,例如,获取对存储在该对象中的对象的引用。任何"支架
目前,我有点愚蠢地解决了这个问题。我定义了一种转换特征,我可以用它来指定一些基本派生类型的关系,例如,如下所示:
// By default, T is a base of itself.
template<typename T> struct conversion_trait
{
typedef T base_type;
};
// Says that "base" is a base type of "derived".
template<> struct conversion_trait<derived>
{
typedef base base_type;
};
关键是,当使用模板构造函数或使用模板赋值运算符实例化持有者时,我实际上使用特征指定的基类类型创建持有者。当访问变量时,我可以使用由traits指定的base和derived类型。
例如,模板构造函数如下所示:
template<typename T> variable::variable(const rcp<T> &rhs)
: m_any(new any) // shared pointer having the any-holder: rcp<any>
{
*m_any = rcp_dynamic_cast<typename conversion_trait<T>::base_type>(rhs);
}
在这里,any
基本上类似于boost::any
而rcp
只是引用计数指针的实现(很像boost::shared_ptr
或者在C ++的STL中11,或多或少)。有理由说明我需要将任何持有者保留在共享指针中以及为什么在任何持有者中都有共享指针。
&#34; getter&#34; rcp指针与任何持有者的内容看起来(以非常简单的方式),如:
template<typename T> rcp<T> variable::get_rcp()
{
typedef typename conversion_trait<T>::base_type base_type;
// First, get the content of the base type of T.
// (templated get() is something like boost::any_cast)
rcp<base_type> base = m_any->get<rcp<base_type>>();
// Then do dynamic cast to T.
return rcp_dynamic_cast<T>(base);
}
现在,如果我在变量中存储derived
类型的实例,我可以使用derived
和base
来访问它。但是,我需要在转换特征的特化中手动指定此关系。
此外,如果层次结构更复杂,可能会有点复杂。如果我的abstract
基础base
derived
基础为base
。这仍然是可行的,将derived
和abstract
的转化特征定义为{{1}}类型,但它开始变得有点麻烦。
问题:如果没有使用此显式转换并且有可能访问&#34; any-holder&#34;是否有任何类型的解决方法可以获得相同的功能使用任何类型?
我知道&#34; dynamic_any&#34;但我无法使用它,因为我无法承担持有人内部物品的副本(副本非常昂贵)。 唯一的其他解决方案&#34;我现在可以想到使用模板化虚拟方法,这当然是不可能的。
提前感谢任何指针或建议。