1

我从我的 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 是否确实做到了,我会切换到它。

4

1 回答 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)

Since in Python floats are immutable, you can't actually pass one to a method and expect the method to change the float value, so we adapt the code to return a tuple of values instead.

于 2010-02-02T18:12:53.613 回答