指向 swig(或 Boost::Python)中的成员的指针
Posted
技术标签:
【中文标题】指向 swig(或 Boost::Python)中的成员的指针【英文标题】:Pointers to members in swig (or Boost::Python) 【发布时间】:2009-11-20 14:20:52 【问题描述】:我从我的 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 中使用指向成员的指针?如果是,有什么诀窍?如果没有,最优雅的工作方式是什么?
感谢您的帮助!
更新:如果有人知道 Boost::python 是否确实做到了,我会改用它。
【问题讨论】:
【参考方案1】:不了解 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 中浮点数是不可变的,因此您实际上不能将 1 传递给方法并期望该方法更改浮点值,因此我们修改代码以返回值元组。
【讨论】:
感谢您的回答。但是,如果我做对了,使用这种方法,您只需传递对变量的引用。我想将指针传递给类成员。不是实例成员。我有一个类 C int a;诠释 b;;还有一个函数 foo(C c, &int C::*) 然后你可以调用 foo(c, &C::a) 或 foo(c, &C::b) 取决于你是否希望你的函数使用成员 a 或实例 c 上的类 C 的成员 b。 在这种情况下,我不知道你如何包装你的方法,因为在包装过程中你需要一个 C 实例。你真的需要指向类成员的指针吗?你不能改变你的设计来只接收一个 int& 吗? 我就是这么做的。但我不满意。最大的想法是有一个具有各种成本的图,我希望一个算法以作为参数传递的成本运行(对于每条边,算法将根据参数选择好的变量)。我觉得我野心太大了。很可能 python 级别太低,不允许为 C++ 提供模板和成员指针的抽象。我还是接受答案。感谢您的努力:)以上是关于指向 swig(或 Boost::Python)中的成员的指针的主要内容,如果未能解决你的问题,请参考以下文章
python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )