This example illustrates how C++ templates can be used from Java using SWIG.
The %addmethods is used for a neater interface from Java as the functions get and set use C++ references to primitive types. These are tricky to use from Java as they end up as a pointer in Java (Java long)./* File : example.h */ // Some template definitions templateT max(T a, T b) { return a>b ? a : b; } template class vector { T *v; int sz; public: vector(int _sz) { v = new T[_sz]; sz = _sz; } T &get(int index) { return v[index]; } void set(int index, T &val) { v[index] = val; } #ifdef SWIG %addmethods { T getitem(int index) { return self->get(index); } void setitem(int index, T val) { self->set(index,val); } } #endif };
Note that SWIG parses the templated function max and templated class vector and so knows about them. However to generate code for use from Java, SWIG has to be told which class/type to use as the template parameter. The SWIG directive %template is used for this./* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" /* Now instantiate some specific template declarations */ %template(maxint) max; %template(maxdouble) max ; %template(vecint) vector ; %template(vecdouble) vector ;
vecdouble dv = new vecdouble(1000); dv.setitem(i, 12.34));