SWIG:Examples:go:template

`SWIG/Examples/go/template/`

## C++ template support

This example illustrates how C++ templates can be used from Go using SWIG.

## The C++ Code

Let's take a templated function and a templated class as follows:

>     /* File : example.h */

>     // Some template definitions

>     template T 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
>       %extend {
>         T getitem(int index) {
>           return self->get(index);
>         }
>         void setitem(int index, T val) {
>           self->set(index,val);
>         }
>       }
>     #endif
>     };

The %extend 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.

## The SWIG interface

A simple SWIG interface for this can be built by simply grabbing the header file like 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;

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.

## A sample Go program

Click here to see a Go program that calls the C++ functions from Go.

## Notes

Use templated classes just like you would any other SWIG generated Go class. Use the classnames specified by the %template directive.

>     vecdouble dv = new vecdouble(1000);
>     dv.setitem(i, 12.34));