Как получить доступ к шаблону списка программы C++ из Perl с помощью SWIG?
Вопрос
Я хочу получить доступ к списку шаблонов программ на 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 интерфейс.
Во-вторых, относительно списков
Вы не можете «получить доступ» к списку C++, например к массиву Perl, с помощью нижнего индекса.Если вы этого хотите, вы должны использовать вектор в качестве базового типа.
В качестве альтернативы создайте класс, расширяющий List, дайте ему новый метод, который возвращает элемент по индексу, и откройте этот метод в интерфейсе.
Если вы хотите получить доступ к списку, найдя элемент, как в C++, вам нужно написать интерфейс List, который предоставляет метод find() — по умолчанию он не использует чтение исходного кода.
Другие советы
В вашем интерфейсе попробуйте:
%include "std_list.i"
%template(ListStruct1) std::list< Struct1 * >;
Библиотека std довольно забавная: в ней нет настоящего двоичного объекта с именем list, который swig мог бы просто обернуть, это все шаблоны, поэтому swig нужна дополнительная помощь, чтобы понять, что происходит.
Это должно добавить в оболочку вставку, удаление и множество других функций, специфичных для списка.
Если вышеперечисленное не работает, попробуйте добавить:
%define SWIG_EXPORT_ITERATOR_METHODS
ОБНОВЛЯТЬ:Конечно, я забыл упомянуть (или даже осознать), что это отлично работает для Python, Java и некоторых других, но совершенно не работает в Perl...