C :从一个基础到另一个基类模板的动态铸造

C++: Dynamic cast from one base to other base class template

本文关键字:基类 另一个 动态 一个      更新时间:2023-10-16

给定以下类结构,我想从struct B中的方法中调用struct C<O>中的方法。C<O>遵循奇怪的重复模板模式。我想在不放置struct O中使用方法的情况下执行此操作。将方法放在struct O中会破坏struct C<>的目的。我怀疑这是不可能的,但我想我会问。

编辑: struct O可以是将struct Bstruct C<O>作为基础类的一组类型中的任何一种。

struct B
{
    virtual void foo ()
    {
        // dynamic_cast this to C<O>* and call C<O>::moo()
    }
};
template <typename P>
struct C
{
    virtual void moo () { }
};
struct O :
    public B,
    public C<O>
{
};

如果在O的定义之后定义了foo键,则可以正常工作:

struct B
{
    virtual void foo();
};
template <typename P>
struct C
{
    virtual void moo() {}
};    
struct O :
    public B,
    public C<O>
{
};
void B::foo()
{
    dynamic_cast<C<O>*>(this)->moo();
}

,所以我建议将CRTP除去并直接从B中铸造为B。或者以少数使C成为非template类,并从中衍生出CRTP。这样的多个O类中的多个都不重要。

struct C
{
    virtual void moo () {}
};
struct B
{
    virtual void foo ()
    {
        auto p_c{dynamic_cast<C *>(this)};
        if(p_c)
        {
            p_c->moo();
        }
    }
};
struct O: public B, public C
{
};
int main()
{
    O o;
    o.foo();
}
相关文章: