我从我的 C++ 应用程序中为 python 做了一些绑定(bind)。
问题是我使用了指向成员的指针(这是为了计算最短路径并将要最小化的属性作为参数)。
这是 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::*)
我有一个重载方法,它使用默认的第 4 个参数,并且效果很好。
那么swig可以使用指向成员的指针吗?如果是的话,诀窍是什么?如果不是,最优雅的工作方式是什么?
感谢您的帮助!
更新:如果有人知道 Boost::python 是否确实做到了,我会切换到它。
最佳答案
不知道 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 中 float 是不可变的,您实际上不能将一个 float 传递给方法并期望该方法更改浮点值,因此我们调整代码以返回一个值元组。
关于c++ - 指向 swig(或 Boost::Python)成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770725/