%module simutry %include "std_vector.i" %inline { namespace simuPOP { // some simple pop class template struct Population { int m_a; Population(int a):m_a(a){} }; // base operator, output pop.m_a template struct Operator { Pop m_pop; Operator(int a):m_pop(a){} virtual ~Operator() { } virtual int funk() const { return m_pop.m_a; } }; // derived operator, output double of pop.m_a template struct DerivedOperator: public Operator { DerivedOperator(int a):Operator(a){} virtual int funk() const { return 2*this->m_pop.m_a; } }; } } #if 1 namespace simuPOP { %template(population) Population< std::pair >; } %inline { namespace simuPOP { typedef Population< std::pair > pop; } } #else %inline { namespace simuPOP { // %template(population) Population< std::pair >; struct pop { int m_a; pop(int a):m_a(a){} }; } } #endif namespace simuPOP { %template(baseOperator) Operator< pop >; %template(derivedOperator) DerivedOperator< pop >; } namespace std { %template(vectorop) vector< simuPOP::Operator * >; } %inline { namespace simuPOP { // test function, use of a vector of Operator* void test( const std::vector< Operator*>& para) { for( size_t i =0; i < para.size(); ++i) para[i]->funk(); } } }