/trunk/Examples/go/template/index.html
HTML | 113 lines | 89 code | 24 blank | 0 comment | 0 complexity | 96aca3733e4b835b92c1f732c9867c42 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- <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>
- Lets 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
- %addmethods {
- T getitem(int index) {
- return self->get(index);
- }
- void setitem(int index, T val) {
- self->set(index,val);
- }
- }
- #endif
- };
- </pre>
- </blockquote>
- The %addmethods 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>