generic-selection.cpp [plain text]
template <typename T, typename U = void*>
struct A {
enum {
id = _Generic(T(), int: 1, float: 2,
U: 3) };
};
static_assert(A<int>::id == 1, "fail");
static_assert(A<float>::id == 2, "fail");
static_assert(A<double, double>::id == 3, "fail");
A<char> a1; A<short, int> a2;
template <typename T, typename U>
struct B {
enum {
id = _Generic(T(),
int: 1, int: 2, U: 3)
};
};
template <unsigned Arg, unsigned... Args> struct Or {
enum { result = Arg | Or<Args...>::result };
};
template <unsigned Arg> struct Or<Arg> {
enum { result = Arg };
};
template <class... Args> struct TypeMask {
enum {
result = Or<_Generic(Args(), int: 1, long: 2, short: 4, float: 8)...>::result
};
};
static_assert(TypeMask<int, long, short>::result == 7, "fail");
static_assert(TypeMask<float, short>::result == 12, "fail");
static_assert(TypeMask<int, float, float>::result == 9, "fail");