SWIG (或 Boost::Python) 中的成员指针
我为我的C++应用程序做了一些与Python的绑定。
问题是我使用了成员指针(这是为了计算最短路径,并将需要最小化的属性作为参数传递)。
这是C++的函数签名:
std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*)
这是我根据文档理解后做的:
%constant float Edge::* distance = &Edge::distance;
这是我从Python调用我的函数的方式:
foo.martins(0, 1000, g, foo.distance)
而我得到的错误是:
NotImplementedError: Wrong number of arguments for overloaded function 'martins'.
Possible C/C++ prototypes are:
martins(int,int,MultimodalGraph &,float Edge::*)
我有一个重载的方法,使用了一个默认的第四个参数,这个方法运行得很好。
那么,使用swig可以使用成员指针吗?如果可以,有什么技巧?如果不可以,最优雅的解决方法是什么?
谢谢你的帮助!
更新:如果有人知道Boost::python是否可以做到这一点,我会考虑切换过去。
1 个回答
2
我不知道SWIG是什么,但在boost::python中,你可以写一个包装器:
bool foo(int x, float* result);
boost::python::tuple foo_wrapper(int x)
{
float v;
bool result = foo(x, &v);
return boost::python::make_tuple(result, v);
}
BOOST_PYTHON_MODULE(foomodule)
{
def("foo", &foo_wrapper);
}
然后在Python中你可以这样做:
result, v = foomodule.foo(x)
因为在Python中,浮点数是不可变的,也就是说你不能把一个浮点数传给一个方法,然后期待这个方法能改变这个浮点数的值,所以我们把代码调整一下,让它返回一个值的元组。