指向 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 )

Swig:将成员变量(指向值的指针)转换为 python 列表

SWIG python初始化一个指向NULL的指针

swig char ** 作为指向 char * 的指针

如何实现 C/C++ 与 Python 的通信

boost python - 如何将原始指针发送到 python 函数>