C++ Utilities  4.14.1
Useful C++ classes and routines such as argument parser, IO and conversion utilities
Classes | Namespaces | Macros | Typedefs | Functions
traits.h File Reference
#include <iterator>
#include <type_traits>
Include dependency graph for traits.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  Traits::Bool< B,... >
 
struct  Traits::Any< T >
 
struct  Traits::Any< Head, Tail... >
 
struct  Traits::All< T >
 
struct  Traits::All< Head, Tail... >
 
struct  Traits::IsSpecializationOf< T, Template >
 
struct  Traits::IsSpecializationOf< Template< Args... >, Template >
 
struct  Traits::IsCString< T >
 
struct  Traits::IsString< T >
 
struct  Traits::IsComplete< T, typename >
 
struct  Traits::IsComplete< T, decltype(void(sizeof(T)))>
 

Namespaces

 Traits
 Contains traits for conveniently exploiting SFINAE.
 

Macros

#define CPP_UTILITIES_PP_COMMA   ,
 The CPP_UTILITIES_PP_COMMA macro helps passing "," as a macro argument. More...
 
#define CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK(CheckName, CheckCode)
 The CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK macro defines a type trait for checking whether some operation can be done with a particular type. More...
 

Typedefs

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

Functions

 Traits::CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (HasSize, std::is_integral< decltype(std::declval< T &>().size())>::value)
 
 Traits::CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (IsReservable, std::declval< T &>().reserve(0u))
 
 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 &>())))
 

Macro Definition Documentation

◆ CPP_UTILITIES_PP_COMMA

#define CPP_UTILITIES_PP_COMMA   ,

The CPP_UTILITIES_PP_COMMA macro helps passing "," as a macro argument.

Definition at line 60 of file traits.h.

◆ CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK

#define CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK (   CheckName,
  CheckCode 
)
Value:
namespace Detail { \
template <typename T> auto CheckName(int) -> decltype(CheckCode, ::Traits::Bool<true>{}); \
template <typename T>::Traits::Bool<false> CheckName(...); \
} \
template <typename T> using CheckName = decltype(Detail::CheckName<T>(0))

The CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK macro defines a type trait for checking whether some operation can be done with a particular type.

See also
Traits::HasSize or Traits::IsIteratable for an example how to use it.

Definition at line 68 of file traits.h.