diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2023-01-03 22:34:59 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2023-01-03 22:38:46 +0000 |
commit | 2fc0edc4fd9da1c25254127128aaa601cad30916 (patch) | |
tree | 3b5cd525d7ea3d9d24b516f4f9858eab0db0893b /Examples | |
parent | cdc08c9325621587038a4e8f582c3adcfe5225e0 (diff) | |
download | swig-2fc0edc4fd9da1c25254127128aaa601cad30916.tar.gz |
Instantiation of C++11 variadic function templates
Complete support for C++11 variadic function templates. Support was previously limited
to just one template parameter. Now zero or more template parameters are supported
in the %template instantiation.
Diffstat (limited to 'Examples')
-rw-r--r-- | Examples/test-suite/cpp11_variadic_function_templates.i | 18 | ||||
-rw-r--r-- | Examples/test-suite/python/cpp11_variadic_function_templates_runme.py | 20 |
2 files changed, 36 insertions, 2 deletions
diff --git a/Examples/test-suite/cpp11_variadic_function_templates.i b/Examples/test-suite/cpp11_variadic_function_templates.i index f95c57a1a..82836a4f3 100644 --- a/Examples/test-suite/cpp11_variadic_function_templates.i +++ b/Examples/test-suite/cpp11_variadic_function_templates.i @@ -78,5 +78,19 @@ void emplace(Args &&... args) noexcept( %} %template(emplace) EmplaceContainer::emplace<int,A>; -// TODO -//%template(emplace) EmplaceContainer::emplace<int,A,B,C>; +%template(emplace) EmplaceContainer::emplace<int,A,B>; +%template(emplace) EmplaceContainer::emplace<int,A,B,C>; +%template(emplace) EmplaceContainer::emplace<int,A,B,C,D>; + + +// Overloading mix of variadic and non-variadic templates +%inline %{ +template<typename T, typename U> int variadicmix1(T t, U u) { return 10; } +template<typename... T> int variadicmix1(T... t) { return 20; } +%} + +%template(variadicmix1) variadicmix1<>; +%template(variadicmix1) variadicmix1<A>; +%template(variadicmix1) variadicmix1<A,B>; +%template(variadicmix1) variadicmix1<A,B,C>; +%template(variadicmix1) variadicmix1<int, int>; diff --git a/Examples/test-suite/python/cpp11_variadic_function_templates_runme.py b/Examples/test-suite/python/cpp11_variadic_function_templates_runme.py new file mode 100644 index 000000000..ae1febb46 --- /dev/null +++ b/Examples/test-suite/python/cpp11_variadic_function_templates_runme.py @@ -0,0 +1,20 @@ +from cpp11_variadic_function_templates import * + +ec = EmplaceContainer() +ec.emplace(A()) +ec.emplace(A(), B()) +ec.emplace(A(), B(), C()) +ec.emplace(A(), B(), C(), D()) + +def check(expected, got): + if expected != got: + raise RuntimeError("failed: {} != {}".format(expected, got)) + +a = A() +b = B() +c = C() +check(variadicmix1(), 20) +check(variadicmix1(a), 20) +check(variadicmix1(a, b), 10) +check(variadicmix1(a, b, c), 20) +check(variadicmix1(11, 22), 10) |