我在查看使用Boost.Python包装一系列类的最佳方法时遇到了一些麻烦,同时避免了混乱的继承问题。假设我有类A,B和C,具有以下结构:
struct A {
virtual void foo();
virtual void bar();
virtual void baz();
};
struct B : public A {
virtual void quux();
};
struct C : public A {
virtual void foobar();
};
我想包装所有类A,B和C,以便它们可以从Python扩展。实现这一目标的常规方法是:
struct A_Wrapper : public A, boost::python::wrapper<A> {
//dispatch logic for virtual functions
};
现在对于从A扩展的B和C类,我希望能够继承和共享A的包装实现。所以我希望能够做到以下几点:
struct B_Wrapper : public B, public A_Wrapper, public boost::python::wrapper<B> {
//dispatch logic specific for B
};
struct C_Wrapper : public C, public A_Wrapper, public boost::python::wrapper<C> {
//dispatch logic specific for C
}
然而,看起来这会引入各种各样的恶意,包括boost包装器的双重继承和B_Wrapper和C_Wrapper对象中A的双重继承。是否有一种常见的方法可以解决这个问题,我错过了?
感谢。
答案 0 :(得分:1)
一种方法是虚拟推导:
struct B : virtual public A, ... { };
struct C : virtual public A, ... { };
struct A_Wrapper : virtual public A, ... { };
请参阅相关的C++ FAQ Lite items了解相关内容及其含义。
答案 1 :(得分:1)
我有完全相同的问题,我只是没有从A_Wrapper继承B_Wrapper(复制和粘贴足以满足我的需求)。 我认为可以在辅助类中共享通用实现:
template<class ADERIVED>
struct A_Implem: public ADERIVED, public wrapper<ADERIVED>
{
// dispatch logic
};
然后:
struct A_Wrapper: public A_Implem<A>
{
// ...
};
struct B_Wrapper: public A_Implem<B>
{
// ...
};