%module template_extend_overload %inline %{ template struct A { }; template struct B { }; %} %define __compose_unary(Class, ArgType, ResType) Class compose(const B& f) { return Class(); } %enddef %define __compose_unary_3(Class, Type) %extend Class { __compose_unary(Class, Type, bool); __compose_unary(Class, Type, double); __compose_unary(Class, Type, int); } %enddef %define compose_unary(Class) __compose_unary_3(Class, bool) __compose_unary_3(Class, double) __compose_unary_3(Class, int) %enddef compose_unary(A); %template(A_double) A; %template(A_int) A; %template(A_bool) A;