summaryrefslogtreecommitdiff
path: root/Examples
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2023-01-03 22:34:59 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2023-01-03 22:38:46 +0000
commit2fc0edc4fd9da1c25254127128aaa601cad30916 (patch)
tree3b5cd525d7ea3d9d24b516f4f9858eab0db0893b /Examples
parentcdc08c9325621587038a4e8f582c3adcfe5225e0 (diff)
downloadswig-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.i18
-rw-r--r--Examples/test-suite/python/cpp11_variadic_function_templates_runme.py20
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)