1

我有一个像这样的 C++ 类:

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++方面,我对如何做到这一点有点困惑。如何覆盖特定的重载?

4

1 回答 1

2

创建可以在 Python 中覆盖的 C++ 虚函数需要一些工作 - 请参见此处。您将需要在调用 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. 如果你确实想定义它,你需要给这两个重载版本不同的名字,就像这里一样。

  • 这两个重载将调用不同的 Python 方法:OnEventOverloadAOnEventOverloadB. 另一种选择是让它们都调用相同的方法OnEvent,然后一个 Python 方法将覆盖这两个重载。

于 2010-03-12T22:42:37.967 回答