%module cpp11_variadic_function_templates // Some tests for variadic function templates %inline %{ class A { public: A() { a = 100; } virtual ~A() {} int a; }; class B { public: B() { b = 200; } virtual ~B() {} int b; }; class C { public: C() { c = 300; } virtual ~C() {} int c; }; class D { public: D() { d = 400; } virtual ~D() {} int d; }; %} // #1863 %inline %{ class Container { public: template static void notifyMyTypes(void (fn)(Args...)); // unconventional function (ptr) template static void notifyMyTypesA(void (*fn)(Args...)) {} // conventional function ptr template static void notifyMyTypesB(void fn(Args...)) {}; // unconventional function (ptr) }; %} %{ template void Container::notifyMyTypes(void (fn)(Args...)) {} // Explicit template instantiations template void Container::notifyMyTypes<>(void (tt)()); template void Container::notifyMyTypes(void (tt)(int)); template void Container::notifyMyTypes(void (tt)(int, double)); %} // Not supported (most vexing parse), see Extending.html#Extending_nn7 //%template(ContainerNotifyMyTypes1) Container::notifyMyTypes; %template(ContainerNotifyMyTypesA1) Container::notifyMyTypesA; %template(ContainerNotifyMyTypesB1) Container::notifyMyTypesB; // #1863 %inline %{ #include class EmplaceContainer { public: template void emplace(Args &&... args) noexcept( std::is_nothrow_constructible::value) {} }; %} %template(emplace) EmplaceContainer::emplace; %template(emplace) EmplaceContainer::emplace; %template(emplace) EmplaceContainer::emplace; %template(emplace) EmplaceContainer::emplace; // Overloading mix of variadic and non-variadic templates %inline %{ template int variadicmix1(T t, U u) { return 10; } template int variadicmix1(T... t) { return 20; } %} %template(variadicmix1) variadicmix1<>; %template(variadicmix1) variadicmix1; %template(variadicmix1) variadicmix1; %template(variadicmix1) variadicmix1; %template(variadicmix1) variadicmix1;