我正在使用SWIG从Python访问C ++代码。如何优雅地包装一个函数,该函数返回通过引用传递的变量中的值,如
void set(double&a) {
a = 42.;
}
我无法知道如何做到这一点。在最好的情况下,我可以在Python中使用Python浮点函数:
>>> b = 2.
>>> set(b)
>>> print b
42.0
目前它给了我一个TypeError: in method 'TestDouble_set', argument 2 of type 'double &'
。
答案 0 :(得分:3)
这样做:
您的swig界面文件:
%include <typemaps.i>
%apply double& INOUT { double& a };
void set(double& a);
python脚本中的用法:
a = 0.0
a = set(a)
print a
如果你的函数返回一些东西(而不是一个空格),请在python中执行以下操作
ret, a = set(a)
在swig中查看文档中的输入法。你可以做INPUT,OUTPUT&amp;不要争论。 HTH
请注意,此解决方案依赖于SWIG提供的OUTPUT类型映射defined in typemaps.i
library,它预先定义了typemaps being used by the %apply
command above。
typemaps.i
定义了C ++原语类型的输入/输出类型图(有关详细信息,请参阅上面的SWIG文档链接);但是,您必须在接口文件中包含typemaps.i库以供SWIG使用它们。 (因此,为什么一些评论者可能发现原始解决方案不适用于他们。)
答案 1 :(得分:1)
请注意,接受的(正确的)解决方案依赖于SWIG提供的OUTPUT类型映射defined in typemaps.i
library,它预先定义了typemaps being used by the %apply
command above。
typemaps.i
定义了C ++原语类型的输入/输出类型图(有关详细信息,请参阅上面的SWIG文档链接);但是,您必须在接口文件中包含typemaps.i库以供SWIG使用它们。 (因此,为什么一些评论者可能发现原始解决方案不适用于他们。)
答案 2 :(得分:0)
支持C ++引用,但SWIG会将它们视为指针。例如,这样的声明:
class Foo { public: double bar(double &a); }
将使用如下函数访问:
double Foo_bar(Foo *obj, double *a) { obj->bar(*a); }
返回引用的函数将映射到返回指针的函数。
我不知道你是如何在python方面映射的... python是否有类似perl引用的东西?