C++ Utilities  4.6.1
Common C++ classes and routines used by my applications such as argument parser, IO and conversion utilities
traits.h
Go to the documentation of this file.
1 #ifndef CPP_UTILITIES_TRAITS_H
2 #define CPP_UTILITIES_TRAITS_H
3 
4 #include <type_traits>
5 
7 namespace Traits {
8 
10 namespace Detail {
11  enum class Enabler {};
12 }
14 
15 template <typename If, typename Then, typename Else>
16 using Conditional = typename std::conditional<If::value, Then, Else>::type;
17 
18 template <bool B, typename...>
19 struct Bool : std::integral_constant<bool, B> {};
20 
21 template <typename T>
23 
24 template <typename... T>
25 struct Any : Bool<false> {};
26 template <typename Head, typename... Tail>
27 struct Any<Head, Tail...> : Conditional<Head, Bool<true>, Any<Tail...> > {};
28 
29 template <typename... T>
30 struct All : Bool<true> {};
31 template <typename Head, typename... Tail>
32 struct All<Head, Tail...> : Conditional<Head, All<Tail...>, Bool<false> > {};
33 
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;
38 
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;
43 
44 template <typename T, template <typename...> class Template>
45 struct IsSpecializationOf : Bool<false> {};
46 template <template <typename...> class Template, typename... Args>
47 struct IsSpecializationOf<Template<Args...>, Template> : Bool<true> {};
48 
49 }
50 
51 #endif // CPP_UTILITIES_TRAITS_H
52 
typename std::enable_if< All< Condition... >::value, Detail::Enabler >::type EnableIf
Definition: traits.h:35
typename std::conditional< If::value, Then, Else >::type Conditional
Definition: traits.h:16
typename std::enable_if<!Any< Condition... >::value, Detail::Enabler >::type DisableIfAny
Definition: traits.h:42
typename std::enable_if<!All< Condition... >::value, Detail::Enabler >::type DisableIf
Definition: traits.h:37
typename std::enable_if< Any< Condition... >::value, Detail::Enabler >::type EnableIfAny
Definition: traits.h:40
Contains traits for conveniently exploiting SFINAE.
Definition: traits.h:7