Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::projected

      From cppreference.com
      <cpp‎ |iterator
       
       
      Iterator library
      Iterator concepts
      Iterator primitives
      Algorithm concepts and utilities
      Indirect callable concepts
      Common algorithm requirements
      (C++20)
      (C++20)
      (C++20)
      Utilities
      projected
      (C++20)
      Iterator adaptors
      Range access
      (C++11)(C++14)
      (C++14)(C++14)  
      (C++11)(C++14)
      (C++14)(C++14)  
      (C++17)(C++20)
      (C++17)
      (C++17)
       
      Defined in header<iterator>
      (1)
      template<std::indirectly_readable I,

               std::indirectly_regular_unary_invocable<I> Proj>
      structprojected
      {
         using value_type=std::remove_cvref_t
                                 <std::indirect_result_t<Proj&, I>>;
         std::indirect_result_t<Proj&, I> operator*()const;// not defined

      };
      (since C++20)
      (until C++26)
      template<std::indirectly_readable I,

               std::indirectly_regular_unary_invocable<I> Proj>

      usingprojected=/*projected-impl*/<I, Proj>::/*type*/;
      (since C++26)
      template<std::weakly_incrementable I,class Proj>

      struct incrementable_traits<std::projected<I, Proj>>
      {
         using difference_type=std::iter_difference_t<I>;

      };
      (2)(since C++20)
      (until C++26)
      Helper templates
      template<class I,class Proj>

      struct/*projected-impl*/
      {
         struct/*type*/
         {
             using value_type=std::remove_cvref_t
                                     <std::indirect_result_t<Proj&, I>>;
             using difference_type=
                 std::iter_difference_t<I>;// conditionally present
             std::indirect_result_t<Proj&, I> operator*()const;// not defined
         };

      };
      (3)(since C++26)
      (exposition only*)
      1)Class(until C++26)Alias(since C++26) templateprojected combines anindirectly_readable typeI and a callable object typeProj into a newindirectly_readable type whose reference type is the result of applyingProj to thestd::iter_reference_t<I>.
      2) This specialization ofstd::incrementable_traits makesstd::projected<I, Proj> aweakly_incrementable type whenI is also aweakly_incrementable type.
      3) An indirect layer used for avoiding unexpectedargument-dependent lookup.
      For the exposition-only nested class/*type*/, the nested typedifference_type exists only ifI modelsweakly_incrementable.

      projected is used only to constrain algorithms that accept callable objects and projections, and hence itsoperator*() is not defined.

      Contents

      [edit]Template parameters

      I - an indirectly readable type
      Proj - projection applied to a dereferencedI

      [edit]Notes

      The indirect layer preventsI andProj to be associated classes ofprojected. When an associated class ofI orProj is an incomplete class type, the indirect layer avoids the unnecessary attempt to inspect the definition of that type that results in hard error.

      [edit]Example

      Run this code
      #include <algorithm>#include <cassert>#include <functional>#include <iterator> template<class T>struct Holder{    T t;}; struct Incomplete; using P= Holder<Incomplete>*; static_assert(std::equality_comparable<P>);// OKstatic_assert(std::indirectly_comparable<P*, P*,std::equal_to<>>);// Error before C++26static_assert(std::sortable<P*>);// Error before C++26 int main(){    P a[10]={};// ten null pointersassert(std::count(a, a+10, nullptr)==10);// OKassert(std::ranges::count(a, a+10, nullptr)==10);// Error before C++26}

      [edit]See also

      computes the value type of anindirectly_readable type by projection
      (alias template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/projected&oldid=182641"

      [8]ページ先頭

      ©2009-2025 Movatter.jp