代码之家  ›  专栏  ›  技术社区  ›  user21714

Boost.蟒蛇包装层次结构避免菱形继承

  •  2
  • user21714  · 技术社区  · 14 年前

    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
    }
    

    然而,这似乎会带来各种各样的麻烦:boost包装器基的双重继承和B_包装器和C_包装器对象中的A的双重继承。有没有一种常见的方法来解决这个实例,而我却不知道?

    2 回复  |  直到 14 年前
        1
  •  1
  •   wilhelmtell    14 年前

    一种方法是虚拟推导:

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

    C++ FAQ Lite items

        2
  •  1
  •   rafak    14 年前

    我也有同样的问题,我只是没有从一个包装器继承B_包装器(复制和粘贴就足够满足我的需要了)。

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