diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2022-12-27 19:36:40 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2022-12-29 23:38:17 +0000 |
commit | 674abaddbf854e2374f115ef08e59fa79702e19a (patch) | |
tree | 73a7d41d03b31258284996f0239a295394ddb209 /Examples | |
parent | 70837bbc2638ec18bd07d333c6e474c89f4ce695 (diff) | |
download | swig-674abaddbf854e2374f115ef08e59fa79702e19a.tar.gz |
Fix instantiation of variadic class templates
containing parameter pack arguments that are function pointers.
template <typename... V> struct VariadicParms {
void ParmsFuncPtrVal(int (*)(V...)) {}
};
%template(VariadicParms0) VariadicParms<>;
%template(VariadicParms1) VariadicParms<A>;
Diffstat (limited to 'Examples')
-rw-r--r-- | Examples/test-suite/cpp11_variadic_templates.i | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/Examples/test-suite/cpp11_variadic_templates.i b/Examples/test-suite/cpp11_variadic_templates.i index bb370cebf..c053e8020 100644 --- a/Examples/test-suite/cpp11_variadic_templates.i +++ b/Examples/test-suite/cpp11_variadic_templates.i @@ -139,8 +139,13 @@ public: %template (LotsInherit3) LotsInherit<A,B,C>; %template (LotsInherit4) LotsInherit<A,B,C,D>; - %inline %{ +struct KlassMemFuncs { + int memfunc0() { return 0; } + int memfunc1() { return 1; } + int memfunc2() { return 2; } + int memfunc3() { return 3; } +}; template <typename... V> struct VariadicParms { public: void ParmsVal(V... vparms_v) {} @@ -151,15 +156,39 @@ public: void ParmsRValueRef(V&&... vparms_r) {} void ParmsConstRef(const V&... vparms_cr) {} + void ParmsFuncPtrVal(int (*)(V...)) {} + void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {} // TODO -// void ParmsFuncPtr(int (*)(V...)) {} +// void ParmsFuncPtrRef(int (*)(V&...)) {} }; %} +%template(VariadicParms0) VariadicParms<>; %template(VariadicParms1) VariadicParms<A>; %template(VariadicParms2) VariadicParms<A,B>; %template(VariadicParms3) VariadicParms<A,B,C>; +%inline %{ +template <typename... V> struct FixedAndVariadicParms { +public: + void ParmsVal(short shortvar, V... vparms_v) {} + void ParmsPtr(short shortvar, V*... vparms_p) {} + void ParmsPtrRef(short shortvar, V*&... vparms_pr) {} + void ParmsPtrRValueRef(short shortvar, V*&&... vparms_rvr) {} + void ParmsRef(short shortvar, V&... vparms_r) {} + void ParmsRValueRef(short shortvar, V&&... vparms_r) {} + void ParmsConstRef(short shortvar, const V&... vparms_cr) {} + + void ParmsFuncPtrVal(short shortvar, int (*)(short, V...)) {} + void ParmsMemFuncPtrVal(int (KlassMemFuncs::*)(V...)) {} +}; +%} + +%template(FixedAndVariadicParms0) FixedAndVariadicParms<>; +%template(FixedAndVariadicParms1) FixedAndVariadicParms<A>; +%template(FixedAndVariadicParms2) FixedAndVariadicParms<A,B>; +%template(FixedAndVariadicParms3) FixedAndVariadicParms<A,B,C>; + // #1863 %inline %{ @@ -167,11 +196,13 @@ class Container { public: template<typename... Args> static void notifyMyTypes(void (fn)(Args...)); +//static void notifyMyTypes(void (*fn)(Args...)); }; %} %{ template<typename... Args> void Container::notifyMyTypes(void (fn)(Args...)) {} +// void Container::notifyMyTypes(void (*fn)(Args...)) {} // Explicit template instantiations template void Container::notifyMyTypes<>(void (tt)()); |