| <html> |
| <head> |
| <title>SWIG:Examples:go:template</title> |
| </head> |
| |
| <body bgcolor="#ffffff"> |
| |
| |
| <tt>SWIG/Examples/go/template/</tt> |
| <hr> |
| |
| <H2>C++ template support</H2> |
| |
| <p> |
| This example illustrates how C++ templates can be used from Go using |
| SWIG. |
| |
| <h2>The C++ Code</h2> |
| |
| Let's take a templated function and a templated class as follows: |
| |
| <blockquote> |
| <pre> |
| /* File : example.h */ |
| |
| // Some template definitions |
| |
| template<class T> T max(T a, T b) { return a>b ? a : b; } |
| |
| template<class T> 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 |
| %extend { |
| T getitem(int index) { |
| return self->get(index); |
| } |
| void setitem(int index, T val) { |
| self->set(index,val); |
| } |
| } |
| #endif |
| }; |
| </pre> |
| </blockquote> |
| The %extend is used for a neater interface from Go as the |
| functions <tt>get</tt> and <tt>set</tt> 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. |
| |
| <h2>The SWIG interface</h2> |
| |
| A simple SWIG interface for this can be built by simply grabbing the |
| header file like this: |
| |
| <blockquote> |
| <pre> |
| /* 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<int>; |
| %template(maxdouble) max<double>; |
| %template(vecint) vector<int>; |
| %template(vecdouble) vector<double>; |
| </pre> |
| </blockquote> |
| |
| Note that SWIG parses the templated function <tt>max</tt> and |
| templated class <tt>vector</tt> 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. |
| |
| <h2>A sample Go program</h2> |
| |
| Click <a href="runme.go">here</a> to see a Go program that calls the |
| C++ functions from Go. |
| |
| <h2>Notes</h2> Use templated classes just like you would any other |
| SWIG generated Go class. Use the classnames specified by the %template |
| directive. |
| |
| <blockquote> |
| <pre> |
| vecdouble dv = new vecdouble(1000); |
| dv.setitem(i, 12.34)); |
| </pre> |
| </blockquote> |
| |
| <hr> |
| </body> |
| </html> |