Come posso accedere al modello di elenco del programma C ++ da Perl usando SWIG?
Domanda
Voglio accedere a un elenco di modelli di programma C ++ da uno script Perl e utilizzare questi valori.
Codice di esempio:
typedef list < Struct1 * > sturct1_list;
struct Struct2
{
int i;
struct1_list List1;
}
struct Struct1
{
int j;
}
Ho usato un aig generato api e ho fatto quanto segue:
$myList = Struct2_struct1List_get
print "Reference type: " . ref($myList) ;
ora questo viene stampato come:
Reference type: \_p\_std\_\_listTutils\_\_Struct1\_p\_t
come ottenere i valori dalla struttura usando questo?
Aggiornamento da una domanda duplicata:
nel file di interfaccia che ho inserito
%template(ListStruct1) std::list< Struct1 * >;
dopo aver generato il " .pm " file. Ho controllato le API disponibili in questo elenco.
Ho trovato
ListStuct1_size
ListStuct1_empty
ListStuct1_clear
ListStuct1_push.
Sono stato in grado di usare quegli elementi. Ma non so come accedere ai singoli elementi dell'elenco usando queste API? o mi sto perdendo qualcosa nel file di interfaccia?
AGGIORNAMENTO:
È possibile utilizzare la typemap per restituire l'elenco come array qui ??
Soluzione
Prima di tutto, informazioni generali
Questo tutorial mostra come eseguire il wrapper per i modelli.
Lo stesso tutorial mostra come usare il modulo da Perl, ma l'esempio perl non tocca i template.
Questo articolo SO mostra come per farlo con un vettore
Ecco una documentazione generale SWIG STL che sembra menzionare < em> std_list.i interfaccia.
Secondo, per quanto riguarda gli elenchi
-
Non puoi " accedere a " Elenco C ++ come un array Perl, in base a un indice. Se lo desideri, devi utilizzare un vettore come tipo sottostante.
-
In alternativa, crea un elenco che estende la classe, dagli un nuovo metodo che restituisce un elemento tramite un indice ed esponi quel metodo in un'interfaccia.
-
Se si desidera accedere all'elenco trovando un elemento, come in C ++, è necessario scrivere un'interfaccia Elenco che espone il metodo find () - quello predefinito non legge il codice sorgente.
Altri suggerimenti
Nella tua interfaccia, prova:
%include "std_list.i"
%template(ListStruct1) std::list< Struct1 * >;
La libreria std è un po 'divertente, non esiste un vero oggetto binario chiamato list che il swig può semplicemente avvolgere, sono tutti modelli - quindi il swig ha bisogno di un aiuto extra per capire cosa sta succedendo.
Ciò dovrebbe aggiungere l'inserimento, la rimozione e un mucchio di altre funzioni specifiche dell'elenco al wrapper.
Se quanto sopra non funziona, prova ad aggiungere:
%define SWIG_EXPORT_ITERATOR_METHODS
AGGIORNAMENTO: Naturalmente, ho trascurato di menzionare (o persino rendermi conto) che questo funziona alla grande per Python, Java e pochi altri, ma è totalmente rotto in Perl ...