Add trait to detect template specialization

Useful to check for std::tuple
This commit is contained in:
Martchus 2017-01-30 00:08:35 +01:00
parent 39960ccef1
commit df1605c9b1
1 changed files with 5 additions and 4 deletions

View File

@ -20,28 +20,29 @@ using Not = Bool<!T::value>;
template <typename... T> template <typename... T>
struct Any : Bool<false> {}; struct Any : Bool<false> {};
template <typename Head, typename... Tail> template <typename Head, typename... Tail>
struct Any<Head, Tail...> : Conditional<Head, Bool<true>, Any<Tail...> > {}; struct Any<Head, Tail...> : Conditional<Head, Bool<true>, Any<Tail...> > {};
template <typename... T> template <typename... T>
struct All : Bool<true> {}; struct All : Bool<true> {};
template <typename Head, typename... Tail> template <typename Head, typename... Tail>
struct All<Head, Tail...> : Conditional<Head, All<Tail...>, Bool<false> > {}; struct All<Head, Tail...> : Conditional<Head, All<Tail...>, Bool<false> > {};
template <typename... Condition> template <typename... Condition>
using EnableIf = typename std::enable_if<All<Condition...>::value, Detail::Enabler>::type; using EnableIf = typename std::enable_if<All<Condition...>::value, Detail::Enabler>::type;
template <typename... Condition> template <typename... Condition>
using DisableIf = typename std::enable_if<!All<Condition...>::value, Detail::Enabler>::type; using DisableIf = typename std::enable_if<!All<Condition...>::value, Detail::Enabler>::type;
template <typename... Condition> template <typename... Condition>
using EnableIfAny = typename std::enable_if<Any<Condition...>::value, Detail::Enabler>::type; using EnableIfAny = typename std::enable_if<Any<Condition...>::value, Detail::Enabler>::type;
template <typename... Condition> template <typename... Condition>
using DisableIfAny = typename std::enable_if<!Any<Condition...>::value, Detail::Enabler>::type; using DisableIfAny = typename std::enable_if<!Any<Condition...>::value, Detail::Enabler>::type;
template <typename T, template <typename...> class Template>
struct IsSpecializationOf : Bool<false> {};
template <template <typename...> class Template, typename... Args>
struct IsSpecializationOf<Template<Args...>, Template> : Bool<true> {};
} }
#endif // CPP_UTILITIES_TRAITS_H #endif // CPP_UTILITIES_TRAITS_H