鉴于以下类结构,我想从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>
{
};
答案 0 :(得分:3)
如果按照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();
}
答案 1 :(得分:0)
因此我建议摆脱CRTP并直接从B转换为C.或者至少使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();
}