2

我很难看到用 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
};

现在对于从 AI 扩展的类 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 的双重继承。有没有一种常见的方法可以解决我缺少的这个实例?

谢谢。

4

2 回答 2

1

一种方法是虚拟推导:

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

请参阅相关的C++ FAQ Lite 项目以获取注释以及这意味着什么。

于 2010-05-07T23:38:50.897 回答
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>
{
// ...
};
于 2010-05-10T11:19:49.343 回答