| %module template_specialization_using_declaration |
| |
| %include <std_string.i> |
| |
| %inline %{ |
| class ConcreteClass { |
| int val; |
| public: |
| ConcreteClass(int i = 0) : val(i) {} |
| int concrete_value() { return val; } |
| }; |
| |
| namespace Space { |
| // primary template class |
| template<typename T> |
| struct BaseTemplate { |
| void method_primary(T t) {} |
| virtual ~BaseTemplate() {} |
| protected: |
| void method_primary_hidden(T t) {} |
| }; |
| // specialized template class |
| template<typename T> |
| struct BaseTemplate<T *> { |
| void method_specialization(T t) {} |
| virtual ~BaseTemplate() {} |
| protected: |
| void method_specialization_hidden(T t) {} |
| }; |
| // partially specialized template class |
| template<> |
| struct BaseTemplate<int> { |
| void method_partial_specialization(int i) {} |
| virtual ~BaseTemplate() {} |
| protected: |
| void method_partial_specialization_hidden(int t) {} |
| }; |
| } |
| %} |
| |
| %template(BaseTemplateString) Space::BaseTemplate<std::string>; |
| %template(BaseTemplateConcreteClass) Space::BaseTemplate<ConcreteClass *>; |
| %template(BaseTemplateInt) Space::BaseTemplate<int>; |
| |
| %inline %{ |
| namespace Space { |
| // primary template class |
| template<typename T> |
| struct DerivedTemplate : BaseTemplate<T> { |
| void method_primary_derived(T t) {} |
| virtual ~DerivedTemplate() {} |
| using BaseTemplate<T>::method_primary_hidden; |
| }; |
| // specialized template class |
| template<typename T> |
| struct DerivedTemplate<T *> : BaseTemplate<T *> { |
| void method_specialization_derived(T t) {} |
| virtual ~DerivedTemplate() {} |
| using BaseTemplate<T *>::method_specialization_hidden; |
| }; |
| // partially specialized template class |
| template<> |
| struct DerivedTemplate<int> : BaseTemplate<int> { |
| void method_partial_specialization_derived(int i) {} |
| virtual ~DerivedTemplate() {} |
| using BaseTemplate<int>::method_partial_specialization_hidden; |
| }; |
| } |
| %} |
| |
| %template(DerivedTemplateString) Space::DerivedTemplate<std::string>; |
| %template(DerivedTemplateConcreteClass) Space::DerivedTemplate<ConcreteClass *>; |
| %template(DerivedTemplateInt) Space::DerivedTemplate<int>; |