This example illustrates how C++ templates can be used from Go using SWIG.
The %addmethods is used for a neater interface from Go as the functions get and set use C++ references to primitive types. These are tricky to use from Go as they end up as pointers, which only work when the C++ and Go types correspond precisely./* 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 };
/* 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;
Note that SWIG parses the templated function max and
templated class vector and so knows about them. However to
generate code for use from Go, SWIG has to be told which class/type to
use as the template parameter. The SWIG directive %template is used
for this.
vecdouble dv = new vecdouble(1000); dv.setitem(i, 12.34));