%module extend_template_method %include %inline %{ namespace Space { class ExtendMe { public: ExtendMe() {} template T do_stuff_impl(int a, T b, double d) { return b; } }; } %} %extend Space::ExtendMe { template T do_stuff(int a, T b) { return $self->do_stuff_impl(a, b, 4.0); } template T do_overloaded_stuff(T b) { return $self->do_stuff_impl(0, b, 4.0); } template static T static_method(T t) { return t; } template ExtendMe(T x) { Space::ExtendMe *em = new Space::ExtendMe(); return em; } } %template(do_stuff_double) Space::ExtendMe::do_stuff; %template(do_stuff_string) Space::ExtendMe::do_stuff; %template(do_overloaded_stuff) Space::ExtendMe::do_overloaded_stuff; %template(do_overloaded_stuff) Space::ExtendMe::do_overloaded_stuff; %template(static_method) Space::ExtendMe::static_method; %template(ExtendMe) Space::ExtendMe::ExtendMe; %inline %{ namespace Space { template class TemplateExtendMe { public: TemplateExtendMe() {} template T template_stuff_impl(X a, T b, double d) { return b; } }; } %} %extend Space::TemplateExtendMe { template T do_template_stuff(int a, T b) { return $self->template_stuff_impl(a, b, 4.0); } template T do_template_overloaded_stuff(T b) { return $self->template_stuff_impl(0, b, 4.0); } template static T static_template_method(T t) { return t; } template TemplateExtendMe(T x) { Space::TemplateExtendMe *em = new Space::TemplateExtendMe(); return em; } %template(do_template_stuff_double) do_template_stuff; %template(do_template_stuff_string) do_template_stuff; %template(do_template_overloaded_stuff) do_template_overloaded_stuff; %template(do_template_overloaded_stuff) do_template_overloaded_stuff; %template(static_template_method) static_template_method; %template(TemplateExtendMe) Space::TemplateExtendMe::TemplateExtendMe; } %template(TemplateExtend) Space::TemplateExtendMe;