fue*_*zig 5 c++ python double swig pass-by-reference
我正在使用 SWIG 从 Python 访问 C++ 代码。我如何优雅地包装一个函数,该函数在通过引用传递的变量中返回值,例如
void set(double&a) {
a = 42.;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何做到这一点。在最好的情况下,我可以在 Python 中使用带有 Python 浮点数的函数:
>>> b = 2.
>>> set(b)
>>> print b
42.0
Run Code Online (Sandbox Code Playgroud)
目前它给了我一个TypeError: in method 'TestDouble_set', argument 2 of type 'double &'.
这样做:
你的 swig 接口文件:
%include <typemaps.i>
%apply double& INOUT { double& a };
void set(double& a);
Run Code Online (Sandbox Code Playgroud)
python脚本中的用法:
a = 0.0
a = set(a)
print a
Run Code Online (Sandbox Code Playgroud)
如果你的函数返回一些东西(而不是一个空值),请在 python 中执行以下操作
ret, a = set(a)
Run Code Online (Sandbox Code Playgroud)
查看 swig 中类型映射的文档。您可以对参数执行 INPUT、OUTPUT 和 INOUT。华泰
请注意,此解决方案依赖于库中定义的typemaps.iSWIG 提供的 OUTPUT 类型映射,它预定义了上述命令使用的类型映射%apply。
typemaps.i定义 C++ 基元类型的输入/输出类型映射(有关更多信息,请参阅上面的 SWIG 文档链接);但是,您必须在接口文件中包含 typemaps.i 库,SWIG 才能使用它们。(因此,为什么一些评论者可能会发现原始解决方案对他们不起作用。)
嗯 - 您使用的是最新版本的 SWIG 吗?文档似乎表明这是有效的——来自手册:
支持 C++ 引用,但 SWIG 会将它们视为指针。例如,这样的声明:
Run Code Online (Sandbox Code Playgroud)class Foo { public: double bar(double &a); }将使用如下函数进行访问:
Run Code Online (Sandbox Code Playgroud)double Foo_bar(Foo *obj, double *a) { obj->bar(*a); }返回引用的函数将被映射为返回指针的函数。
我不知道你如何将其映射到 python 端...python 是否有类似 perl 引用的东西?