2010-03-12 27 views
1

解決重載我有一個C++類是這樣的:在Boost.Python的

class ConnectionBase 
{ 
public: 
    ConnectionBase(); 
    template <class T> Publish(const T&); 

private: 
    virtual void OnEvent(const Overload_a&) {} 
    virtual void OnEvent(const Overload_b&) {} 
}; 

我的模板&重載是在編譯時的類型已知的固定集。應用程序代碼從ConnectionBase派生並重寫OnEvent來處理它所關心的事件。我可以這樣做,因爲這組類型是已知的。 OnEvent是私有的,因爲用戶從不調用它,該類創建一個將其稱爲回調的線程。 C++代碼起作用。

我已經把它包裝在boost.python中,我可以導入它並從python發佈。我想在Python中創建以下等效:

class ConnectionDerived 
{ 
public: 
    ConnectionDerived(); 

private: 
    virtual void OnEvent(const Overload_b&) 
    { 
     // application code 
    } 
}; 

我不在乎(不願)露出了默認的OnEvent功能,因爲他們從來沒有從應用程序代碼中調用 - 我只是想爲C++類提供一個正文。 但是...因爲python沒有輸入,所以我看到內部處理的boost.python示例都在C++端,我對於如何做到這一點有些困惑。我如何覆蓋特定的重載?

回答

2

創建可以在Python中重寫的C++虛函數需要一些工作 - 請參閱here。您需要在調用Python方法的派生類中創建包裝函數。這裏是如何可以工作:

struct ConnectionBaseWrap : ConnectionBase, wrapper<ConnectionBase> 
{ 
    void OnEvent(const Overload_a &obj) { 
     if (override f = get_override("OnEventOverloadA")) 
      f(obj); 
    } 
    void OnEvent(const Overload_b &obj) { 
     if (override f = get_override("OnEventOverloadB")) 
      f(obj); 
    } 
}; 

BOOST_PYTHON_MODULE(yourmodule) { 
    class_<ConnectionBaseWrap, boost::noncopyable>("ConnectionBase") 
     //Your additional definitions here. 
    ; 
} 

一些注意事項:

  • 既然你將不會被Python調用基類的一個OnEvent功能,你不需要用.def定義它。如果你確實想定義它,你需要給兩個重載版本不同的名稱,如here.

  • 兩個重載將調用不同的Python方法:OnEventOverloadAOnEventOverloadB。另一個選擇是讓它們都調用相同的方法OnEvent,然後一個Python方法將覆蓋兩個重載。