Как мне получить доступ к шаблону списка программы на C ++ из Perl, используя SWIG? - PullRequest
0 голосов
/ 18 сентября 2009

Я хочу получить доступ к шаблону списка программ на C ++ из Perl-скрипта и использовать эти значения.

Пример кода:

typedef list < Struct1  * > sturct1_list;

struct Struct2
{
    int i;
    struct1_list List1;
}

struct Struct1
{
    int j;
}

Я использовал один сгенерированный SWI API и сделал следующее:

$myList = Struct2_struct1List_get 
print "Reference type: " . ref($myList) ;

теперь это печатается как:

Reference type:  \_p\_std\_\_listTutils\_\_Struct1\_p\_t 

как получить значения из структуры, используя это?

Обновление от повторяющегося вопроса:

в файле интерфейса я положил

%template(ListStruct1) std::list< Struct1 * >;

после того, как я сгенерировал ".pm" файл. Я проверил API, доступные в этом списке.

Я нашел

ListStuct1_size
ListStuct1_empty
ListStuct1_clear
ListStuct1_push.

Я смог использовать эти элементы. Но я не знаю, как получить доступ к отдельным элементам списка, используя эти API? или я что-то упустил в файле интерфейса?

ОБНОВЛЕНИЕ:

Возможно ли отображение типа здесь вернуть список в виде массива ??

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Прежде всего, общая информация

В этом руководстве показано, как сделать обертку для шаблонов.

В том же руководстве показано, как использовать модуль из Perl, но пример perl не касается шаблонов.

В этой статье показано, как это сделать с вектором

Вот общая документация SWIG STL , в которой упоминается std_list.i interface.

Во-вторых, относительно списков

  1. Вы не можете "получить доступ" к списку C ++, как к массиву Perl, по нижнему индексу. Если вы этого хотите, вы должны использовать Vector как базовый тип.

  2. В качестве альтернативы создайте класс, расширяющий List, дайте ему новый метод, который возвращает элемент по индексу, и предоставьте этот метод в интерфейсе.

  3. Если вы хотите получить доступ к списку путем поиска элемента, как в C ++, вам нужно написать интерфейс List, который предоставляет метод find () - по умолчанию он не читает исходный код.

1 голос
/ 29 сентября 2009

В вашем интерфейсе попробуйте:

%include "std_list.i"

%template(ListStruct1) std::list< Struct1 * >;

Библиотека std довольно забавная, на самом деле нет бинарного объекта под названием list, который swig может просто обернуть, это все шаблоны - поэтому swig нужна дополнительная помощь, чтобы выяснить, что происходит.

Это должно добавить вставку, удаление и кучу других специальных функций списка в оболочку.

Если вышеописанное не работает, попробуйте добавить:

%define SWIG_EXPORT_ITERATOR_METHODS 

ОБНОВЛЕНИЕ: Конечно, я не упомянул (или даже не понял), что это прекрасно работает для python, java и некоторых других, но полностью не работает в perl ...

...