Boost.Python包装层次结构,避免钻石继承

时间:2010-05-07 22:45:08

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

我想包装所有类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的双重继承。是否有一种常见的方法可以解决这个问题,我错过了?

感谢。

2 个答案:

答案 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>
{
// ...
};