C++ Utilities  4.11.0
Common C++ classes and routines used by my applications such as argument parser, IO and conversion utilities
Classes | Typedefs | Functions
Traits Namespace Reference

Contains traits for conveniently exploiting SFINAE. More...

Classes

struct  All
 
struct  All< Head, Tail... >
 
struct  Any
 
struct  Any< Head, Tail... >
 
struct  Bool
 
struct  IsCString
 
struct  IsSpecializationOf
 
struct  IsSpecializationOf< Template< Args... >, Template >
 
struct  IsString
 

Typedefs

template<typename If , typename Then , typename Else >
using Conditional = typename std::conditional< If::value, Then, Else >::type
 
template<typename T >
using Not = Bool<!T::value >
 
template<typename... Condition>
using EnableIf = typename std::enable_if< All< Condition... >::value, Detail::Enabler >::type
 
template<typename... Condition>
using DisableIf = typename std::enable_if<!All< Condition... >::value, Detail::Enabler >::type
 
template<typename... Condition>
using EnableIfAny = typename std::enable_if< Any< Condition... >::value, Detail::Enabler >::type
 
template<typename... Condition>
using DisableIfAny = typename std::enable_if<!Any< Condition... >::value, Detail::Enabler >::type
 

Functions

 CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (HasSize, std::is_integral< decltype(std::declval< T &>().size())>::value)
 
 CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (IsReservable, std::declval< T &>().reserve(0u))
 
 CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (IsIteratable, std::begin(std::declval< T &>()) !=std::end(std::declval< T &>()) CPP_UTILITIES_PP_COMMA void() CPP_UTILITIES_PP_COMMA++std::declval< decltype(begin(std::declval< T &>())) &>() CPP_UTILITIES_PP_COMMA void(*begin(std::declval< T &>())))
 

Detailed Description

Contains traits for conveniently exploiting SFINAE.

Typedef Documentation

◆ Conditional

template<typename If , typename Then , typename Else >
using Traits::Conditional = typedef typename std::conditional<If::value, Then, Else>::type

Definition at line 16 of file traits.h.

◆ DisableIf

template<typename... Condition>
using Traits::DisableIf = typedef typename std::enable_if<!All<Condition...>::value, Detail::Enabler>::type

Definition at line 34 of file traits.h.

◆ DisableIfAny

template<typename... Condition>
using Traits::DisableIfAny = typedef typename std::enable_if<!Any<Condition...>::value, Detail::Enabler>::type

Definition at line 37 of file traits.h.

◆ EnableIf

template<typename... Condition>
using Traits::EnableIf = typedef typename std::enable_if<All<Condition...>::value, Detail::Enabler>::type

Definition at line 33 of file traits.h.

◆ EnableIfAny

template<typename... Condition>
using Traits::EnableIfAny = typedef typename std::enable_if<Any<Condition...>::value, Detail::Enabler>::type

Definition at line 36 of file traits.h.

◆ Not

template<typename T >
using Traits::Not = typedef Bool<!T::value>

Definition at line 21 of file traits.h.

Function Documentation

◆ CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK() [1/3]

Traits::CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK ( HasSize  ,
std::is_integral< decltype(std::declval< T &>().size())>::value   
)

◆ CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK() [2/3]

Traits::CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK ( IsReservable  ,
std::declval< T & >  ).reserve(0u 
)

◆ CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK() [3/3]

Traits::CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK ( IsIteratable  ,
std::begin(std::declval< T &>()) !  = std::end(std::declval< T &>()) CPP_UTILITIES_PP_COMMA void() CPP_UTILITIES_PP_COMMA++std::declval< decltype(begin(std::declval< T &>())) &>() CPP_UTILITIES_PP_COMMA void(*begin(std::declval< T &>())) 
)