python函数作为c ++暴露类的参数使用:: boost :: python

时间:2011-11-20 08:43:48

标签: c++ python boost-python

我一直在使用Python和C ++一段时间,但从未尝试过实现以下内容:

我喜欢python用户能够编写如下内容:

def foo(a,b):
    return a+b

myclass.myfunc(foo)

其中myclass是一个用Boost.Python暴露给python的c ++类,其中一个方法(myfunc)带有一个函数:

int func(int,int)

签名,只有那个。

这可能吗?

我正在考虑宣布:

myclass::myfunc(boost::python::object)

并提取typedef'ed函数签名,但我只是猜测..

也许有更好/可行的方法来实现这一点,可能还有一些'功能'对象?

1 个答案:

答案 0 :(得分:3)

你几乎猜到了答案。 Python函数确实只是boost::python::object个实例。然后,您可以只有boost::function<int (int, int)>并将Python对象放在其中。

我刚刚安装了我的操作系统而我还没有Boost,所以我无法测试它,但我认为如果你这样做(没有任何包装函数)它会起作用:

void function(boost::function<int (int, int)> func) {
    // ...
}

// And then you expose the function as you normally would

我期待以上工作;如果没有,这肯定会:

void function_wrap(boost::python::object func)
{
    auto lambda = [func](int a, int b) -> int {
        return boost::python::extract<int>(func(a, b));
    };
    function(boost::function<int (int, int)>(lambda));
}

// And then you expose the wrapper, not the original function