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

时间:2009-11-20 14:20:52

标签: c++ python 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::*)

我有一个使用默认的第4个参数的重载方法,它运行得很好。

那么可以使用带有swig的成员指针吗?如果是的话,有什么诀窍?如果不是,那么最优雅的工作方式是什么?

感谢您的帮助!

UPDATE:如果有人知道Boost :: python是否确实这样做了,我会切换到它。

1 个答案:

答案 0 :(得分: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中浮点数是不可变的,所以你实际上不能将一个方法传递给一个方法并期望该方法改变浮点值,所以我们调整代码以返回一个值元组。