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

Python から拡張できるように、すべてのクラス A、B、および C をラップしたいと考えています。これを達成するための通常の方法は、次のようになります。

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
}

ただし、ブースト ラッパー ベースの二重継承と、B_Wrapper および C_Wrapper オブジェクトでの A の二重継承により、あらゆる種類の厄介な問題が発生するようです。私が見逃しているこのインスタンスを解決する一般的な方法はありますか?

ありがとう。

4

2 に答える 2

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 に答える
1

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 に答える