C++: динамическое приведение из одного базового шаблона в другой класс

Учитывая приведенную ниже структуру классов, я хочу вызвать метод в struct C<O> из метода в struct B, C<O> следует следует любопытно повторяющегося шаблона. Я хочу сделать это без размещения методов в struct O, Методы размещения в struct O победит цель struct C<>, Я подозреваю, что это невозможно, но подумал, что спросить.

РЕДАКТИРОВАТЬ: struct O может быть любым из набора типов, которые имеют оба struct B а также struct 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>
{
};

2 ответа

Если вы определили foo вне строки, следуя определению O, оно будет работать нормально:

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 и привести к C непосредственно из B. Или, по крайней мере, сделать C не шаблонный класс и производный от него 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();
}
Другие вопросы по тегам