mirror of https://github.com/swig/swig
101 lines
2.3 KiB
OpenEdge ABL
101 lines
2.3 KiB
OpenEdge ABL
%module cpp11_variadic_function_templates
|
|
|
|
#if defined SWIGGO
|
|
%warnfilter(SWIGWARN_LANG_NATIVE_UNIMPL) EmplaceContainer::emplace;
|
|
#endif
|
|
|
|
// 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<typename... Args>
|
|
static void notifyMyTypes(void (fn)(Args...)); // unconventional function (ptr)
|
|
template<typename... Args>
|
|
static void notifyMyTypesA(void (*fn)(Args...)) {} // conventional function ptr
|
|
template<typename... Args>
|
|
static void notifyMyTypesB(void fn(Args...)) {} // unconventional function (ptr)
|
|
};
|
|
%}
|
|
%{
|
|
template<typename... Args>
|
|
void Container::notifyMyTypes(void (fn)(Args...)) {}
|
|
|
|
// Explicit template instantiations
|
|
template void Container::notifyMyTypes<>(void (tt)());
|
|
template void Container::notifyMyTypes<int>(void (tt)(int));
|
|
template void Container::notifyMyTypes<int, double>(void (tt)(int, double));
|
|
%}
|
|
|
|
// Not supported (most vexing parse), see Extending.html#Extending_nn7
|
|
//%template(ContainerNotifyMyTypes1) Container::notifyMyTypes<int>;
|
|
%template(ContainerNotifyMyTypesA1) Container::notifyMyTypesA<int>;
|
|
%template(ContainerNotifyMyTypesB1) Container::notifyMyTypesB<int>;
|
|
|
|
// #1863
|
|
%inline %{
|
|
#include <type_traits>
|
|
class EmplaceContainer {
|
|
public:
|
|
template<typename T, typename... Args>
|
|
void emplace(Args &&... args) noexcept(
|
|
std::is_nothrow_constructible<T, Args &&...>::value) {}
|
|
};
|
|
%}
|
|
|
|
%template(emplace) EmplaceContainer::emplace<int,A>;
|
|
%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>;
|