¿Cómo crear un archivo de interfaz SWIG?

Soy nuevo en SWIG

Y menos tiempo para hacer las cosas. Estoy tratando de enlazar las clases de c ++ a python. He configurado SWIG en Windows y he intentado ejecutarlo. Fue un exito

Mi archivo example.i es como

/* File: example.i */ %module example %{ #define SWIG_FILE_WITH_INIT #include "Item.h" }% #include "Item.h" 

Pero parece que tiene que incluir o declarar la clase de archivos de encabezado, constructor, plantillas, etc.

¿Alguien puede sugerir cómo crear un archivo de interfaz SWIG.

A continuación se muestra el archivo de encabezado (Item.h) que necesito para crear el archivo de interfaz.

 #ifndef __ITEM_H__ #define __ITEM_H__ #include  #include  #include  template class Item { std::string name_; T val_; public: Item(std::string name, T val) : name_(name), val_(val) {} Item(Item &rhs) : name_(rhs.name_), val_(rhs.val_) {} Item(const Item &rhs) : name_(rhs.name_), val_(rhs.val_) {} ~Item() {} std::string name() const { return name_; } T operator()() const { return val_; } double norm() const { return sqrt(val_ * val_); } }; template class Item<std::complex > { std::string name_; std::complex val_; public: Item(std::string name, std::complex val) : name_(name), val_(val) {} Item(Item<std::complex > &rhs) : name_(rhs.name_), val_(rhs.val_) {} Item(const Item<std::complex > &rhs) : name_(rhs.name_), val_(rhs.val_) {} ~Item() {} std::string name() const { return name_; } std::complex operator()() const { return val_; } double norm() const { return sqrt(val_.real() * val_.real() + val_.imag() * val_.imag()); } }; template struct ItemComparator : public std::binary_function<Item, Item, bool> { inline bool operator()(Item lhs, Item rhs) { return lhs.norm() < rhs.norm(); } }; #endif 

Aquí hay un archivo de interfaz para su ejemplo. SWIG tiene soporte incorporado para std :: string y std :: complex. Debe declarar las clases concretas de las plantillas que desea utilizar a través de% template:

 %module Item %{ #include "Item.h" %} %include  %include  %include "Item.h" %template(Int) Item; %template(Complex) Item >; 

Utilízalo como:

 >>> import Item >>> a=Item.Int('Int1',5) >>> b=Item.Complex('Cplx1',2+3j) >>> a.name() 'Int1' >>> b.name() 'Cplx1' >>> a.norm() 5.0 >>> b.norm() 3.605551275463989