首页 > 解决方案 > 具有默认实现的 boost-python 虚函数

问题描述

在 boost python 中公开一个非纯虚函数的推荐方法是如下所示包装它。

提升python文档

struct Base
{
    virtual ~Base() {}
    virtual int f() { return 0; }
};

struct BaseWrap : Base, wrapper<Base>
{
    int f()
    {
        if (override f = this->get_override("f"))
            return f(); // *note*
        return Base::f();
    }

    int default_f() { return this->Base::f(); }
};

最后曝光:

class_<BaseWrap, boost::noncopyable>("Base")
    .def("f", &Base::f, &BaseWrap::default_f)
    ;

该文件解释了

请注意,我们同时公开了&Base::f&BaseWrap::default_f。Boost.Python 需要跟踪 1) 调度函数 f 和 2) 转发函数到其默认实现 default_f。为此目的,有一个特殊的 def 函数。

这个特殊的 def 函数实际上是做什么的,下面有什么区别?

.def("f", &Base::f, &BaseWrap::default_f)
.def("f", &BaseWrap::default_f)

从源代码中class.hpp::def_impl,我只看到default_f作为重载函数添加到命名空间也为&Base::f。由于相同的签名,default_f将替换&Base::f

有什么我错过的吗?任何建议或示例都会有很大帮助!

标签: pythonc++boostboost-python

解决方案


推荐阅读