C++ 带有动态类型铸造的任何类型保持架

C++ 带有动态类型铸造的任何类型保持架,c++,C++,我正试图实现一个对象持有者(类似于boost::any),它具有一个附加特性,可以使用对象的基类类型访问对象。我理解,仅仅使用boost::any类是不可能的,因为在访问对象时,人们需要随时知道对象的精确类型,例如,获取存储在此“any”持有者中的对象的引用 目前,我正在用一种有点愚蠢的方式解决这个问题。我定义了一种转换特性,通过它我可以指定一些基本派生类型关系,例如,如下所示: // By default, T is a base of itself. template<typename

我正试图实现一个对象持有者(类似于
boost::any
),它具有一个附加特性,可以使用对象的基类类型访问对象。我理解,仅仅使用
boost::any
类是不可能的,因为在访问对象时,人们需要随时知道对象的精确类型,例如,获取存储在此“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;
};
因此,现在,如果我在变量中存储了
derived
类型的实例,我可以使用
derived
base
访问它。然而,我需要在转换特性的专门化中手动指定此关系

此外,如果层次结构更复杂,可能会有点复杂。如果我有一个层次结构
abstract
base of
base
base of
derived
。将
base
derived
的转换特性定义为
abstract
类型仍然是可行的,但它开始变得有点麻烦

问题:是否有任何解决方法可以在不使用此显式转换的情况下获得相同的功能,并且可以使用任何类型访问“任何持有者”

我知道“”,但我不能使用它,因为我负担不起在支架内复制物品的费用(复制品相当昂贵)。 我现在能想到的唯一其他“解决方案”是使用模板虚拟方法,这当然是不可能的


提前感谢您的指点或建议。

您是否注意到在
boost::any
boost中还提供了一个
boost::variant
类型,它可能更适合您的需要?@πάταῥεῖ 但是,C++是一种强类型的语言,没有真实的反射。尝试引入语言特性(如动态键入)通常不是一个好主意。我已经走了你要走的路,我向你保证,这条路只包含疯狂。话虽如此,我还不清楚什么是引用,什么是指针,什么是代码中的具体实例。在我看来,m_any->get()要么自己返回一个rcp,要么可以从引用中分配rcp?@MadScienceDreams如果可以的话,我会将Python用于这个更合适的应用程序。然而,最初的选择是C++,所以这是我应该遵循的方式:-感谢通知,它当然应该是<代码> MyOn-> GET()/<代码>(Type)。所有元素都是同一层次结构的一部分吗?除此之外,您可能希望描述您想要解决的真正问题,而不是您在使用预期解决方案时遇到的问题。
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);
}
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);
}