Technical Specification | ||||
Filesystem library(filesystem TS) | ||||
Library fundamentals(library fundamentals TS) | ||||
Library fundamentals 2(library fundamentals TS v2) | ||||
Library fundamentals 3(library fundamentals TS v3) | ||||
Extensions for parallelism(parallelism TS) | ||||
Extensions for parallelism 2(parallelism TS v2) | ||||
Extensions for concurrency(concurrency TS) | ||||
Extensions for concurrency 2(concurrency TS v2) | ||||
Concepts(concepts TS) | ||||
Ranges(ranges TS) | ||||
Reflection(reflection TS) | ||||
Mathematical special functions(special functions TR) | ||||
Experimental Non-TS | ||||
Pattern Matching | ||||
Linear Algebra | ||||
std::execution | ||||
Contracts | ||||
2D Graphics |
detection idiom | ||||
Defined in header <experimental/type_traits> | ||
template<template<class...>class Op,class...Args> using is_detected=/* see below */; | (library fundamentals TS v2) | |
template<template<class...>class Op,class...Args> using detected_t=/* see below */; | (library fundamentals TS v2) | |
template<class Default,template<class...>class Op,class...Args> using detected_or=/* see below */; | (library fundamentals TS v2) | |
The alias templatedetected_or
is an alias for an unspecified class type with two public member typedefsvalue_t
andtype
, which are defined as follows:
value_t
is an alias forstd::true_type, andtype
is an alias forOp<Args...>;value_t
is an alias forstd::false_type andtype
is an alias forDefault
.The alias templateis_detected
is equivalent totypename detected_or<std::experimental::nonesuch, Op, Args...>::value_t. It is an alias forstd::true_type if thetemplate-idOp<Args...> denotes a valid type; otherwise it is an alias forstd::false_type.
The alias templatedetected_t
is equivalent totypename detected_or<std::experimental::nonesuch, Op, Args...>::type. It is an alias forOp<Args...> if thattemplate-id denotes a valid type; otherwise it is an alias for the classstd::experimental::nonesuch.
template<template<class...>class Op,class...Args> constexprbool is_detected_v= is_detected<Op, Args...>::value; | (library fundamentals TS v2) | |
template<template<class...>class Op,class...Args> constexprinlinebool is_detected_v= is_detected<Op, Args...>::value; | (library fundamentals TS v3) | |
template<class Default,template<class...>class Op,class...Args> using detected_or_t=typename detected_or<Default, Op, Args...>::type; | (library fundamentals TS v2) | |
template<class Expected,template<class...>class Op,class...Args> using is_detected_exact=std::is_same<Expected, detected_t<Op, Args...>>; | (library fundamentals TS v2) | |
template<class Expected,template<class...>class Op,class...Args> constexprbool is_detected_exact_v= | (library fundamentals TS v2) | |
template<class Expected,template<class...>class Op,class...Args> constexprinlinebool is_detected_exact_v= | (library fundamentals TS v3) | |
template<class To,template<class...>class Op,class...Args> using is_detected_convertible= | (library fundamentals TS v2) | |
template<class To,template<class...>class Op,class...Args> constexprbool is_detected_convertible_v= | (library fundamentals TS v2) | |
template<class To,template<class...>class Op,class...Args> constexprinlinebool is_detected_convertible_v= | (library fundamentals TS v3) | |
The alias templateis_detected_exact
checks whetherdetected_t<Op, Args...> isExpected
.
The alias templateis_detected_convertible
checks whetherdetected_t<Op, Args...> is convertible toTo
.
namespace detail{template<class Default,class AlwaysVoid,template<class...>class Op,class...Args>struct detector{using value_t=std::false_type;using type= Default;}; template<class Default,template<class...>class Op,class...Args>struct detector<Default,std::void_t<Op<Args...>>, Op, Args...>{using value_t=std::true_type;using type= Op<Args...>;};}// namespace detail template<template<class...>class Op,class...Args>using is_detected=typename detail::detector<nonesuch,void, Op, Args...>::value_t; template<template<class...>class Op,class...Args>using detected_t=typename detail::detector<nonesuch,void, Op, Args...>::type; template<class Default,template<class...>class Op,class...Args>using detected_or= detail::detector<Default,void, Op, Args...>;
#include <cstddef>#include <experimental/type_traits> template<class T>using copy_assign_t= decltype(std::declval<T&>()=std::declval<const T&>()); struct Meow{};struct Purr{void operator=(const Purr&)= delete;}; static_assert(std::experimental::is_detected<copy_assign_t, Meow>::value,"Meow should be copy assignable!");static_assert(!std::experimental::is_detected_v<copy_assign_t, Purr>,"Purr should not be copy assignable!");static_assert(std::experimental::is_detected_exact_v<Meow&, copy_assign_t, Meow>,"Copy assignment of Meow should return Meow&!"); template<class T>using diff_t=typename T::difference_type; template<class Ptr>using difference_type= std::experimental::detected_or_t<std::ptrdiff_t, diff_t, Ptr>; struct Woof{using difference_type=int;};struct Bark{}; static_assert(std::is_same<difference_type<Woof>,int>::value,"Woof's difference_type should be int!");static_assert(std::is_same<difference_type<Bark>,std::ptrdiff_t>::value,"Bark's difference_type should be ptrdiff_t!"); int main(){}