Swig:如何包装双& (双参考)?

时间:2010-08-12 18:06:08

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

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

3 个答案:

答案 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)

嗯 - 您使用的是最新版本的SWIG吗?文档似乎表明这是有效的 - 来自手册:

  

支持C ++引用,但SWIG会将它们视为指针。例如,这样的声明:

class Foo {
public:
    double bar(double &a);
}
     

将使用如下函数访问:

double Foo_bar(Foo *obj, double *a) {
    obj->bar(*a);
}
     

返回引用的函数将映射到返回指针的函数。

我不知道你是如何在python方面映射的... python是否有类似perl引用的东西?