Как получить доступ к шаблону списка программы C++ из Perl с помощью SWIG?

StackOverflow https://stackoverflow.com/questions/1443576

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Пример кода:

typedef list < Struct1  * > sturct1_list;

struct Struct2
{
    int i;
    struct1_list List1;
}

struct Struct1
{
    int j;
}

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

$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?или я что-то упускаю в файле интерфейса?

ОБНОВЛЕНО:

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

Это было полезно?

Решение

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

Этот урок показывает, как сделать оболочку для шаблонов.

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

Эта статья ТАК показывает, как это сделать с помощью вектора

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

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

  1. Вы не можете «получить доступ» к списку C++, например к массиву Perl, с помощью нижнего индекса.Если вы этого хотите, вы должны использовать вектор в качестве базового типа.

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

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

Другие советы

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

%include "std_list.i"

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

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

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

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

%define SWIG_EXPORT_ITERATOR_METHODS 

ОБНОВЛЯТЬ:Конечно, я забыл упомянуть (или даже осознать), что это отлично работает для Python, Java и некоторых других, но совершенно не работает в Perl...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top