Swig: Как обернуть в двойной & (двойной передается по ссылке)? - PullRequest
3 голосов
/ 12 августа 2010

Я использую SWIG для доступа к коду C ++ из Python. Как элегантно обернуть функцию, которая возвращает значения в переменных, переданных по ссылке, как

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 ]

3 голосов
/ 17 декабря 2010

Сделайте это следующим образом:

Ваш файл интерфейса 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 & INOUT для аргументов.HTH

Обратите внимание, что это решение основано на предоставляемых SWIG картах типов OUTPUT , определенных в typemaps.i library , которые предварительно определяют карты типов , используемые командой %apply выше.

typemaps.i определяет карты типов ввода / вывода для примитивных типов C ++ (дополнительную информацию см. В приведенной выше ссылке на документацию SWIG);однако вы должны включить библиотеку typemaps.i в свой интерфейсный файл, чтобы SWIG использовал их.(Следовательно, почему некоторые комментаторы, вероятно, обнаружили, что оригинальное решение не работает для них.)

1 голос
/ 23 августа 2017

Обратите внимание, что принятое (правильное) решение основано на предоставленных SWIG картах типов OUTPUT , определенных в typemaps.i библиотеке , которая предварительно определяет карты типов , используемые командой %apply выше .

typemaps.i определяет типы карт ввода / вывода для примитивных типов C ++ (дополнительную информацию см. В приведенной выше ссылке на документацию SWIG); однако вы должны включить библиотеку typemaps.i в свой интерфейсный файл, чтобы SWIG использовал их. (Следовательно, почему некоторые комментаторы, вероятно, обнаружили, что оригинальное решение не работает для них.)

0 голосов
/ 12 августа 2010

хмм - вы используете последнюю версию SWIG?Документация, кажется, указывает, что это работает - из руководства:

C ++ ссылки поддерживаются, но SWIG будет рассматривать их как указатели.Например, объявление вроде этого:

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

будет доступно с помощью функции, подобной этой:

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

Функции, возвращающие ссылку, будут отображены в функции, возвращающие указатели.

Я не знаю, как вы отображаете это на стороне Python ... есть ли у Python что-то вроде ссылок на Perl?

...