Swig:如何包装双人床&;(通过引用进行双传递)? 我使用SWIG从Python访问C++代码。如何优雅地包装一个函数,该函数返回通过引用传递的变量中的值,如 void set(double&a) { a = 42.; }

Swig:如何包装双人床&;(通过引用进行双传递)? 我使用SWIG从Python访问C++代码。如何优雅地包装一个函数,该函数返回通过引用传递的变量中的值,如 void set(double&a) { a = 42.; },c++,python,double,pass-by-reference,swig,C++,Python,Double,Pass By Reference,Swig,我不知道该怎么做。在最好的情况下,我可以将Python中的函数与Python浮点一起使用: >>> b = 2. >>> set(b) >>> print b 42.0 目前它给了我一个类型错误:在方法“TestDouble\u set”中,参数2的类型为“double&”hmm-您使用的是最新版本的SWIG吗?文档似乎表明这是可行的——从手册: 支持C++引用,但SWIG将它们视为指针。例如,这样的声明: class Foo { publ

我不知道该怎么做。在最好的情况下,我可以将Python中的函数与Python浮点一起使用:

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

目前它给了我一个
类型错误:在方法“TestDouble\u set”中,参数2的类型为“double&”

hmm-您使用的是最新版本的SWIG吗?文档似乎表明这是可行的——从手册:

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

class Foo {
public:
    double bar(double &a);
}
double Foo_bar(Foo *obj, double *a) {
    obj->bar(*a);
}
将使用如下函数访问:

class Foo {
public:
    double bar(double &a);
}
double Foo_bar(Foo *obj, double *a) {
    obj->bar(*a);
}
返回引用的函数将映射到返回指针的函数中

我不知道如何在python端映射它……python有类似perl的引用吗?

这样做:

您的swig接口文件:

  %include <typemaps.i>

  %apply double& INOUT { double& a };
  void set(double& a);
如果您的函数返回了一些东西(而不是一个void),请在python中执行以下操作

  ret, a = set(a)
在swig中检查类型映射的文档。您可以为参数执行输入、输出和INOUT操作。嗯

请注意,此解决方案依赖于SWIG提供的输出类型映射,它预先定义了

<> >代码>类型:I < /COD>定义C++原始类型的输入/输出类型映射(参见上面链接到SWIG文档以获取更多信息);但是,您必须将typemaps.i库包含在接口文件中,以便SWIG使用它们。(因此,一些评论者可能会发现原来的解决方案对他们不起作用。)

请注意,被接受的(正确的)解决方案依赖于SWIG提供的输出类型映射,它预先定义了


<> >代码>类型:I < /COD>定义C++原始类型的输入/输出类型映射(参见上面链接到SWIG文档以获取更多信息);但是,您必须在接口文件中包含typemaps.i库,以便SWIG使用它们。(因此,一些评论者可能会发现原来的解决方案对他们不起作用。)

不是最新的,而是SWIG版本1.3.29。但我不认为这一点最近有所改变。可以使用SWIG提供的
cpointer.I
来实现这一点,但它并不麻烦。例如,请参阅:I get:>>>a=TestDouble.setx(a)回溯(最近一次调用):文件“”,第1行,in?TypeError:在方法“setx”中,参数1的类型为“double&”,我在一个API中有上述内容&我的开发伙伴每天都在使用它。上述错误是由swig在生成绑定时生成的吗?是否包括%{…%}之间的标头。你能把你的.i文件发大一点吗?从一个简单的项目开始,只使用一个函数setx()&然后是setx(double&)&然后添加这个类。SWIG版本是3.0.5。