使用::boost::python将Python函数作为参数传递给C++暴露的类
我已经在使用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)
然后提取这个类型定义的函数签名,但我只是猜测……
也许还有更好的方法来实现这个,可能可以用某种“函数”对象?
1 个回答
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