C++ Python包装层次结构避免菱形继承

C++ Python包装层次结构避免菱形继承,c++,python,boost,boost-python,C++,Python,Boost,Boost Python,我不知道用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();

我不知道用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
};
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
}
struct A_Wrapper:public A,boost::python::Wrapper{
//虚拟函数的调度逻辑
};
现在,对于从A扩展而来的类B和C,我希望能够继承和共享A的包装实现。因此,我希望能够按照以下思路做一些事情:

struct A_Wrapper : public A, boost::python::wrapper<A> {
    //dispatch logic for virtual functions
};
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
}
结构B_包装器:public B,public A_包装器,public boost::python::Wrapper{ //特定于B的调度逻辑 }; 结构C_包装器:公共C,公共A_包装器,公共boost::python::包装器{ //特定于C的分派逻辑 } 然而,这似乎会带来各种各样的不好,boost包装器基的双重继承以及B_包装器和C_包装器对象中A的双重继承。有没有一种我没有的解决这个问题的通用方法


谢谢。

一种方法是虚拟推导:

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

请参阅相关的注释以及这意味着什么。

我遇到了完全相同的问题,我只是没有从A_包装中继承B_包装(复制和粘贴足以满足我的需要)。 我认为可以在助手类中共享通用实现:

template<class ADERIVED>
struct A_Implem: public ADERIVED, public wrapper<ADERIVED>
{
    // dispatch logic
};
模板
结构A_Implem:公共引导,公共包装
{
//调度逻辑
};
然后:

struct A_Wrapper: public A_Implem<A>
{
// ...
};


struct B_Wrapper: public A_Implem<B>
{
// ...
};
struct A\u Wrapper:public A\u Implem
{
// ...
};
结构B_包装器:公共A_Implem
{
// ...
};

感谢您的回复。如果我不一定要修改继承关系以利用虚拟继承,那该怎么办?我也想到了这个解决方案,但它不是超级吸引人的,而且过于侵入。当然,这是一个相当常见的操作,即包装一个类型层次结构,其中层次结构中的多个非叶点可以通过Python进行扩展,但我找不到任何关于它的讨论。是的,这实际上是我目前的解决方案。这是可行的,但在我看来相当笨拙。我希望我错过了什么。但这可能是唯一的非侵入性选项。只有当A、B和C都使用相同数量的构造函数参数时,这似乎才起作用,因为A_Implem知道如何调用ADERIVED的构造函数。还是我遗漏了什么?