2009-11-20 38 views
1

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

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

这是C++签名:

std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*) 

这是我做的(从我在doc理解):

%constant float Edge::* distance = &Edge::distance; 

这是我打电话给我的功能从蟒蛇:

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是否确实如此,我会切换到它。

回答

2

不知道痛饮,但的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彩车是不可改变的,你实际上不能将一个方法传递给一个方法,并期望该方法改变浮点值,所以我们调整代码以返回一个值的元组。

+0

谢谢你的回答。但是如果我把它做对了,用这种方法你只需要传递一个变量的引用。 我想传递一个指向类成员的指针。不是给一个实例成员。 我有一个类C {int a; int b;};然后你可以调用foo(c,&C :: a)或foo(c,&C :: b),这取决于你想让你的函数使用成员函数a或实例c上的类C的成员b。 – 2010-02-07 15:03:20

+0

在这种情况下,我不知道如何包装你的方法,因为在包装过程中你需要一个C实例。你真的需要指向类成员的指针吗?难道你不能改变你的设计接受一个int而不是? – 2010-02-08 16:37:26

+0

这就是我所做的。但我不满意。最大的想法是有一个具有各种成本的图形,我想要一个算法以运行成本作为参数运行(对于每个边,算法将根据参数选择好的变量)。 我觉得我太野心勃勃了。很可能python的层次太低,并且不允许为C++提供模板和成员指针的抽象。 我仍然接受答案。感谢您的努力:) – 2010-02-09 16:15:44