1 #ifndef CPP_UTILITIES_TRAITS_H 2 #define CPP_UTILITIES_TRAITS_H 11 enum class Enabler {};
15 template <
typename If,
typename Then,
typename Else>
16 using Conditional =
typename std::conditional<If::value, Then, Else>::type;
18 template <
bool B,
typename...>
19 struct Bool : std::integral_constant<bool, B> {};
24 template <
typename... T>
26 template <
typename Head,
typename... Tail>
29 template <
typename... T>
31 template <
typename Head,
typename... Tail>
32 struct All<Head, Tail...> :
Conditional<Head, All<Tail...>, Bool<false> > {};
34 template <
typename... Condition>
35 using EnableIf =
typename std::enable_if<
All<Condition...>::value, Detail::Enabler>::type;
36 template <
typename... Condition>
37 using DisableIf =
typename std::enable_if<!
All<Condition...>::value, Detail::Enabler>::type;
39 template <
typename... Condition>
40 using EnableIfAny =
typename std::enable_if<
Any<Condition...>::value, Detail::Enabler>::type;
41 template <
typename... Condition>
42 using DisableIfAny =
typename std::enable_if<!
Any<Condition...>::value, Detail::Enabler>::type;
44 template <
typename T,
template <
typename...>
class Template>
46 template <
template <
typename...>
class Template,
typename... Args>
51 #endif // CPP_UTILITIES_TRAITS_H
typename std::enable_if< All< Condition... >::value, Detail::Enabler >::type EnableIf
typename std::conditional< If::value, Then, Else >::type Conditional
typename std::enable_if<!Any< Condition... >::value, Detail::Enabler >::type DisableIfAny
typename std::enable_if<!All< Condition... >::value, Detail::Enabler >::type DisableIf
typename std::enable_if< Any< Condition... >::value, Detail::Enabler >::type EnableIfAny
Contains traits for conveniently exploiting SFINAE.