我正在使用 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/