5 #ifndef TCPSPSUITE_TEMPLATE_MAGIC_HPP
6 #define TCPSPSUITE_TEMPLATE_MAGIC_HPP
16 template<
class T,
bool enabled>
17 struct OptionalMember {} ;
20 struct OptionalMember<T, false> {
22 template<
class ... Ts>
23 OptionalMember(Ts ...) {}
27 struct OptionalMember<T, true> :
public T
37 template<
class TrueType,
class FalseType,
bool b>
38 struct ConditionalMember {};
40 template<
class TrueType,
class FalseType>
41 struct ConditionalMember<TrueType, FalseType, true> :
public TrueType
44 using TrueType::TrueType;
47 template<
class TrueType,
class FalseType>
48 struct ConditionalMember<TrueType, FalseType, false> :
public FalseType
51 using FalseType::FalseType;
63 template<
typename QueryT>
64 constexpr
bool pack_contains() {
69 template<
typename QueryT,
typename First,
typename ...Rest>
70 constexpr
bool pack_contains();
72 template<
typename QueryT,
bool found,
typename ...Rest>
73 constexpr
typename std::enable_if<found, bool>::type pack_contains_forward() {
77 template<
typename QueryT,
bool found,
typename ...Rest>
78 constexpr
typename std::enable_if<! found, bool>::type pack_contains_forward() {
79 return pack_contains<QueryT, Rest...>();
82 template<
typename QueryT,
typename First,
typename ...Rest>
83 constexpr
bool pack_contains() {
84 return pack_contains_forward<QueryT, std::is_same<QueryT, First>::value, Rest...>();
95 template<
class ...>
struct pack {};
99 #endif //TCPSPSUITE_TEMPLATE_MAGIC_HPP