Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::experimental::is_detected,std::experimental::detected_t,std::experimental::detected_or

      From cppreference.com
      <cpp‎ |experimental
       
       
       
       
      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:

      • If thetemplate-idOp<Args...> denotes a valid type, thenvalue_t is an alias forstd::true_type, andtype is an alias forOp<Args...>;
      • Otherwise,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.

      [edit]Additional utilities

      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=

          is_detected_exact<Expected, Op, Args...>::value;
      (library fundamentals TS v2)
      template<class Expected,template<class...>class Op,class...Args>

      constexprinlinebool is_detected_exact_v=

          is_detected_exact<Expected, Op, Args...>::value;
      (library fundamentals TS v3)
      template<class To,template<class...>class Op,class...Args>

      using is_detected_convertible=

         std::is_convertible<detected_t<Op, Args...>, To>;
      (library fundamentals TS v2)
      template<class To,template<class...>class Op,class...Args>

      constexprbool is_detected_convertible_v=

          is_detected_convertible<To, Op, Args...>::value;
      (library fundamentals TS v2)
      template<class To,template<class...>class Op,class...Args>

      constexprinlinebool is_detected_convertible_v=

          is_detected_convertible<To, Op, Args...>::value;
      (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.

      [edit]Possible implementation

      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...>;

      [edit]Example

      Run this code
      #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(){}
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/experimental/is_detected&oldid=154972"

      [8]ページ先頭

      ©2009-2025 Movatter.jp