2010-05-07 38 views
2

我有一些麻烦看到什么是最好的方式来包装一系列与Boost.Python的类,同时避免凌乱的继承问题。说我有类A,B和C结构如下:Boost.Python包装层次结构避免钻石继承

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

现在对于B级和C从AI延长想能够继承并分享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 
} 

然而,这似乎是将引入污秽的所有方式与升压包装基地双遗产和A在B_Wrapper和C_Wrapper的双遗产对象。有没有一种常见的方式来解决我失踪的这个实例?

谢谢。

回答

1

一种方法是几乎得出:

struct B : virtual public A, ... { }; 
struct C : virtual public A, ... { }; 
struct A_Wrapper : virtual public A, ... { }; 

见注释和这意味着什么相关C++ FAQ Lite items

+0

感谢您的答复。 如果我无法修改继承关系以利用虚拟继承,那么情况如何?这个解决方案也发生在我身上,但它不是超级吸引人的,并且是过度侵入性的。当然,这是一个相当常见的操作,即包装一个类型层次结构,层次结构中的多个非叶子点可以通过Python扩展,但是我一直无法找到它的任何讨论。 – user21714 2010-05-08 00:36:28

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> 
{ 
// ... 
}; 
+0

是的,这实际上是我目前的解决方案。这是可行的,但对我来说似乎相当笨拙。我希望有一些我只是失踪。但也许这是唯一的非侵入性选项。 – user21714 2010-05-10 14:42:59

+0

这只有在A,B和C都采用相同数量的构造函数参数时才起作用,因为A_Implem已经知道如何调用ADERIVED的构造函数。或者我错过了什么? – 2012-05-22 11:29:33