2010-03-12 48 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方法将覆盖两个重载。