指向swig(或Boost::Python)中成员的指针 我从C++应用程序中为python做了一些绑定。

指向swig(或Boost::Python)中成员的指针 我从C++应用程序中为python做了一些绑定。,c++,python,swig,boost-python,C++,Python,Swig,Boost Python,问题是,我使用指向成员的指针(它用于计算最短路径并将属性作为参数最小化) 这是C++签名: std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*) 这是我如何从python调用函数的: foo.martins(0, 1000, g, foo.distance) 这就是我得到的错误: NotImplementedError: Wrong number of argu

问题是,我使用指向成员的指针(它用于计算最短路径并将属性作为参数最小化)

这是C++签名:

std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*)
这是我如何从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是否确实做到了,我将切换到它。

不知道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中的浮点值是不可变的,因此实际上不能将一个浮点值传递给一个方法并期望该方法更改浮点值,因此我们修改代码以返回一个值元组。

谢谢您的回答。但是如果我做对了,使用这种方法,你只需要传递一个变量的引用。我想传递一个指向类成员的指针。不适用于实例成员。我有一个类C{inta;intb;};和一个函数foo(C,&int C::*),然后您可以调用foo(C,&C::a)或foo(C,&C::b),这取决于您是否希望您的函数在实例C上使用类C的成员a或成员b。在这种情况下,我不知道如何包装您的方法,因为在包装过程中需要一个C实例。您真的需要指向类成员的指针吗?你不能改变你的设计,只接收一个int&而不是吗?我就是这么做的。但我并不满意。大的想法是有一个具有各种代价的图,我希望一个算法以传递的代价作为参数运行(对于每个边,算法将根据参数选择好的变量)。我觉得我太野心勃勃了。最有可能的Python是太低的级别,不允许提供C++和模板和成员指针的抽象。我仍然接受这个答案。谢谢你的努力:)
result, v = foomodule.foo(x)