| /* This unit tests whether SWIG correctly parses the code and makes wrappers | |
| for the new C++11 extern templates (explicit template instantiation without | |
| using the translation unit). | |
| */ | |
| %module cpp11_template_explicit | |
| /* Suppress SWIG warnings related to explicit template instantiation and extern templates */ | |
| #pragma SWIG nowarn=SWIGWARN_PARSE_EXPLICIT_TEMPLATE | |
| #pragma SWIG nowarn=SWIGWARN_PARSE_EXTERN_TEMPLATE | |
| %inline %{ | |
| template<typename T> class Temper { | |
| public: | |
| T valu; | |
| }; | |
| class A { | |
| public: | |
| int member; | |
| int memberFunction() { return 100; } | |
| }; | |
| class B { | |
| public: | |
| short member; | |
| short memberFunction() { return 100; } | |
| }; | |
| template class Temper<A>; | |
| extern template class Temper<B>; | |
| template class Temper<A*>; | |
| extern template class Temper<B*>; | |
| template class Temper<int>; | |
| extern template class Temper<short>; | |
| /* Templated function to check support for extern template functions */ | |
| template <typename T> | |
| T my_templated_function(int a, double b) | |
| { | |
| return T(); | |
| } | |
| /* Explicit extern function template instantiation with simple type */ | |
| extern template int my_templated_function<int>(int, double); | |
| template int my_templated_function<int>(int, double); | |
| /* Explicit extern function template instantiation with more complex types */ | |
| extern template A my_templated_function<A>(int, double); | |
| template A my_templated_function<A>(int, double); | |
| extern template Temper<int> my_templated_function<Temper<int>>(int, double); | |
| template Temper<int> my_templated_function<Temper<int>>(int, double); | |
| /* Explicit function template instantiation with a trailing return type */ | |
| template <typename T> | |
| auto trailing_function(T t) -> T { return t; } | |
| extern template auto trailing_function<int>(int) -> int; | |
| template auto trailing_function<int>(int) -> int; | |
| extern template auto trailing_function<const A *>(const A *) -> const A *; | |
| template auto trailing_function<const A *>(const A *) -> const A *; | |
| %} | |
| %template(TemperInt) Temper<int>; | |
| /* Enable several versions of the templated function */ | |
| %template(my_templated_function_int ) my_templated_function<int>; | |
| %template(my_templated_function_A ) my_templated_function<A>; | |
| %template(my_templated_function_TemperInt) my_templated_function<Temper<int>>; | |
| %template(trailing_function_int) trailing_function<int>; |