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();
}