我一直在使用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函数签名,但我只是猜测..
也许有更好/可行的方法来实现这一点,可能还有一些'功能'对象?
答案 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