5 #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH 6 #define DUNE_COMMON_STD_TYPE_TRAITS_HH 9 #include <dune-common-config.hh> 13 #if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED 14 #include <experimental/type_traits> 33 #if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED 35 using std::experimental::nonesuch;
39 using std::experimental::is_detected_v;
42 using std::experimental::is_detected_exact_v;
44 using std::experimental::is_detected_convertible_v;
46 #else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED 56 template<
typename Default,
typename Void,
template<
typename...>
class Op,
typename... Args>
59 using value_t = std::false_type;
64 template<
typename Default,
template<
typename...>
class Op,
typename... Args>
65 struct detector<Default,
std::
void_t<Op<Args...>>, Op, Args...>
67 using value_t = std::true_type;
68 using type = Op<Args...>;
127 template<
typename Default,
template<
typename...>
class Op,
typename... Args>
140 template<
template<
typename...>
class Op,
typename... Args>
143 #ifdef __cpp_variable_templates 154 template<
template<
typename...>
class Op,
typename... Args>
155 constexpr
bool is_detected_v =
is_detected<Op,Args...>::value;
156 #endif // __cpp_variable_templates 169 template<
template<
typename...>
class Op,
typename... Args>
184 template<
typename Default,
template<
typename...>
class Op,
typename... Args>
194 template<
typename Expected,
template<
typename...>
class Op,
typename... Args>
197 #ifdef __cpp_variable_templates 205 template<
typename Expected,
template<
typename...>
class Op,
typename... Args>
206 constexpr
bool is_detected_exact_v =
is_detected_exact<Expected,Op,Args...>::value;
207 #endif // __cpp_variable_templates 216 template<
typename Target,
template<
typename...>
class Op,
typename... Args>
219 #ifdef __cpp_variable_templates 227 template<
typename Target,
template<
typename...>
class Op,
typename... Args>
229 #endif // __cpp_variable_templates 231 #endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED 238 template <
class Type>
239 [[deprecated(
"Type extraction of `TargetType` has failed. Inspect the code calling `detected_or_fallback_t` for getting the source of this warning!")]]
242 template <
class Type,
class T>
243 Type warningIfNotDefined(
const T*);
247 template <
template<
typename...>
class Fallback,
248 template<
typename...>
class TargetType,
typename... Args>
250 detail::warningIfNotDefined<Std::detected_t<Fallback, Args...> >(std::declval<
const Std::detected_t<TargetType, Args...>*>())),
251 TargetType, Args...>;
256 #endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition: type_traits.hh:141
void operator=(const nonesuch &)=delete
Type representing a lookup failure by std::detected_or and friends.
Definition: type_traits.hh:84
typename detected_or< Default, Op, Args... >::type detected_or_t
Returns Op<Args...> if that is valid; otherwise returns the fallback type Default.
Definition: type_traits.hh:185
typename Impl::voider< Types... >::type void_t
Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
Definition: typetraits.hh:40
Dune namespace
Definition: alignedallocator.hh:12
Utilities for type computations, constraining overloads, ...
typename detected_or< nonesuch, Op, Args... >::type detected_t
Returns Op<Args...> if that is valid; otherwise returns nonesuch.
Definition: type_traits.hh:170
Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std::declval< const Std::detected_t< TargetType, Args... > * >())), TargetType, Args... > detected_or_fallback_t
This type will be either TargetType<Args...> if it exists, or the Fallback<Args...> type.
Definition: type_traits.hh:251
std::is_convertible< Target, detected_t< Op, Args... > > is_detected_convertible
Checks whether Op<Args...> is convertible to Target without causing an error if Op<Args...> is invalid.
Definition: type_traits.hh:217
Traits for type conversions and type information.
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
Checks whether Op<Args...> is Expected without causing an error if Op<Args...> is invalid...
Definition: type_traits.hh:195
Impl::detector< Default, void, Op, Args... > detected_or
Detects whether Op<Args...> is valid and makes the result available.
Definition: type_traits.hh:128