`SWIG/Examples/java/template/`

## C++ template support

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

## The C++ Code

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

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).

## 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 Java, SWIG has to be told which class/type to use as the template parameter. The SWIG directive %template is used for this.

## A sample Java program

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

## Notes

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

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