2010-05-07 39 views
2

我有一些麻煩看到什麼是最好的方式來包裝一系列與Boost.Python的類,同時避免凌亂的繼承問題。說我有類A,B和C結構如下:Boost.Python包裝層次結構避免鑽石繼承

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

現在對於B級和C從AI延長想能夠繼承並分享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 
} 

然而,這似乎是將引入污穢的所有方式與升壓包裝基地雙遺產和A在B_Wrapper和C_Wrapper的雙遺產對象。有沒有一種常見的方式來解決我失蹤的這個實例?

謝謝。

回答

1

一種方法是幾乎得出:

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

見註釋和這意味着什麼相關C++ FAQ Lite items

+0

感謝您的答覆。 如果我無法修改繼承關係以利用虛擬繼承,那麼情況如何?這個解決方案也發生在我身上,但它不是超級吸引人的,並且是過度侵入性的。當然,這是一個相當常見的操作,即包裝一個類型層次結構,層次結構中的多個非葉子點可以通過Python擴展,但是我一直無法找到它的任何討論。 – user21714 2010-05-08 00:36:28

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

是的,這實際上是我目前的解決方案。這是可行的,但對我來說似乎相當笨拙。我希望有一些我只是失蹤。但也許這是唯一的非侵入性選項。 – user21714 2010-05-10 14:42:59

+0

這隻有在A,B和C都採用相同數量的構造函數參數時才起作用,因爲A_Implem已經知道如何調用ADERIVED的構造函數。或者我錯過了什麼? – 2012-05-22 11:29:33