c++ - Swig:如何包装 double&(double 通过引用传递)?

标签 c++ python double pass-by-reference swig

我正在使用 SWIG 从 Python 访问 C++ 代码。我如何优雅地包装一个函数,该函数返回通过引用传递的变量中的值

void set(double&a) {
  a = 42.;
}

我不知道该怎么做。在最好的情况下,我将能够在 Python 中使用带有 Python float 的函数:

>>> b = 2.
>>> set(b)
>>> print b
42.0

目前它给了我一个 TypeError: in method 'TestDouble_set', argument 2 of type 'double &'

最佳答案

这样做:

你的 swig 接口(interface)文件:

  %include <typemaps.i>

  %apply double& INOUT { double& a };
  void set(double& a);

在 python 脚本中的用法:

  a = 0.0
  a = set(a)
  print a

如果你的函数返回一些东西(而不是一个 void),在 python 中执行下面的操作

  ret, a = set(a)

查看 swig 中类型映射的文档。您可以为参数执行 INPUT、OUTPUT 和 INOUT。

请注意,此解决方案依赖于 SWIG 提供的输出类型映射 defined in typemaps.i library , 它预定义了 typemaps being used by the %apply command above .

typemaps.i 定义 C++ 基本类型的输入/输出类型映射(有关更多信息,请参阅上面的 SWIG 文档链接);但是,您必须在接口(interface)文件中包含 typemaps.i 库,以便 SWIG 使用它们。 (因此,为什么一些评​​论者可能会发现原始解决方案对他们不起作用。)

关于c++ - Swig:如何包装 double&(double 通过引用传递)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470641/

相关文章:

c++ - 可以从 QXmlStreamWriter 获取 QDomElement 吗?

c++ - 推导类的模板参数

java - MongoDB group() 函数中使用 Long 累加器代替 Double

Java 双重比较与字符串比较

c++ - 无法初始化双数组

android - <unknown> detectAndCompute() 中发生错误

c++ - 如何将 valgrind 测试添加到我的 cmake "test"目标

python - 如何在 Python 中正确生成可变字符串模式

python - 如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘

python - Celery导入库后找不到周期性任务