c++ - 指向 swig(或 Boost::Python)成员的指针

标签 c++ python swig boost-python

我从我的 C++ 应用程序中为 python 做了一些绑定(bind)。

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

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

最佳答案

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

关于c++ - 指向 swig(或 Boost::Python)成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1770725/

相关文章:

python - 为什么Python OpenCV相机在Ubuntu中读取速度比Windows慢?

php 自定义 C++ 模块从命令行工作,而不是在网络服务器上工作

c++ - 尝试验证 C++ 中的输入

C++:以下代码有什么问题吗?

python - 允许用户更改其图片。 Django

python - 最佳实践 : automated web API testing

python - 使用 SWIG 从 C 返回列表到 Python

python - 使用 SWIG 将 C++ 对象指针传递给 Python,而不是再次传回 C++

C++ 编译型资源所有者断言

java - Swig:如何将 "FILE"类型从 C++ 传递到 Java