SWIG (或 Boost::Python) 中的成员指针

1 投票
1 回答
1044 浏览
提问于 2025-04-15 16:12

我为我的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中,浮点数是不可变的,也就是说你不能把一个浮点数传给一个方法,然后期待这个方法能改变这个浮点数的值,所以我们把代码调整一下,让它返回一个值的元组。

撰写回答