Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::generator

      From cppreference.com
      <cpp‎ |coroutine
       
       
      Utilities library
       
      Coroutine support
      Coroutine traits
      Coroutine handle
      No-op coroutines
      Trivial awaitables
      Range generators
      generator
      (C++23)
       
      Ranges library
      Range adaptors
       
       
      Defined in header<generator>
      template<

         class Ref,
         class V=void,
         class Allocator=void>
      class generator

         :publicranges::view_interface<generator<Ref, V, Allocator>>
      (1)(since C++23)
      namespace pmr{

         template<class Ref,class V=void>
         using generator=
              std::generator<Ref, V,std::pmr::polymorphic_allocator<>>;

      }
      (2)(since C++23)
      1) The class templatestd::generator presents aview of the elements yielded by the evaluation of acoroutine.
      2) Convenience alias template for thegenerator using thepolymorphic allocator.

      Astd::generator generates a sequence of elements by repeatedly resuming the coroutine from which it was returned.Each time aco_yield statement is evaluated, the coroutine produces one element of the sequence.When theco_yield statement is of the formco_yield ranges::elements_of(rng), each element of therangerng is successively produced as an element of the sequence.

      std::generator modelsview andinput_range.

      The behavior of a program that adds a specialization forstd::generator is undefined.

      Contents

      [edit]Template parameters

      Ref - the reference type (ranges::range_reference_t) of the generator. IfV isvoid, both the reference type and the value type are inferred fromRef
      V - the value type (ranges::range_value_t) of the generator, orvoid
      Allocator - an allocator type orvoid

      IfAllocator is notvoid, then the behavior is undefined ifAllocator does not meet theAllocator requirements.

      [edit]Member types

      Member Definition
      value(private)std::conditional_t<std::is_void_v<V>,std::remove_cvref_t<Ref>, V>;
      (exposition-only member type*)
      reference(private)std::conditional_t<std::is_void_v<V>, Ref&&, Ref>;
      (exposition-only member type*)
      yieldedstd::conditional_t<std::is_reference_v<reference >, reference,const reference &>
      Type requirements
      -
      std::allocator_traits<Allocator>::pointer is a pointer type.
      -
      value is a cv-unqualified object type.
      -
      reference is either a reference type, or a cv-unqualified object type that modelscopy_constructible.
      -
      LetRRef denotestd::remove_reference_t<reference >&&, ifreference is a reference type, andreference otherwise.

      The program is ill-formed if any of these type requirements is not satisfied.

      [edit]Data members

      Member Definition
      active_(private)

      Internally, each active instance ofstd::generator is associated with a stack (handled as if by object of typestd::unique_ptr<std::stack<std::coroutine_handle<>>>).

      • Whenbegin is called, a new stack is created and the generator is added to the stack.
      • Whenco_yield ranges::elements_of(rng) is evaluated in a generator body,rng is converted to a generator and added to the stack that contains the enclosing generator.
      • When a generator iterator isincremented, the coroutine at the top of the associated stack is resumed.
      • When a generator finishes (i.e. whenpromise_type::final_suspend is called), it is removed from the stack.
        (exposition-only member object*)
      coroutine_(private) a handle of typestd::coroutine_handle<promise_type>
      (exposition-only member object*)

      [edit]Member functions

      constructs agenerator object
      (public member function)[edit]
      effectively destroys the entire stack of yieldedgenerators
      (public member function)[edit]
      assigns agenerator object
      (public member function)[edit]
      resumes the initially suspended coroutine and returns an iterator to its handle
      (public member function)[edit]
      returnsstd::default_sentinel
      (public member function)[edit]
      Inherited fromstd::ranges::view_interface
      returns whether the derived view is empty, provided only if it satisfiessized_range orforward_range
      (public member function ofstd::ranges::view_interface<D>)[edit]
      (C++23)
      returns a constant iterator to the beginning of the range
      (public member function ofstd::ranges::view_interface<D>)[edit]
      (C++23)
      returns a sentinel for the constant iterator of the range
      (public member function ofstd::ranges::view_interface<D>)[edit]
      returns whether the derived view is not empty, provided only ifranges::empty is applicable to it
      (public member function ofstd::ranges::view_interface<D>)[edit]

      [edit]Nested classes

      the promise type
      (public member class)
      the iterator type
      (exposition-only member class*)

      [edit]Notes

      Feature-test macroValueStdFeature
      __cpp_lib_generator202207L(C++23)std::generator – synchronouscoroutine generator forranges

      [edit]Example

      Run this code
      #include <generator>#include <iostream> template<typename T>struct Tree{    T value;    Tree*left{},*right{};     std::generator<const T&> traverse_inorder()const{if(left)            co_yield std::ranges::elements_of(left->traverse_inorder());         co_yield value; if(right)            co_yield std::ranges::elements_of(right->traverse_inorder());}}; int main(){    Tree<char> tree[]{{'D', tree+1, tree+2},//                            │//            ┌───────────────┴────────────────┐//            │                                │{'B', tree+3, tree+4},{'F', tree+5, tree+6},//            │                                │//  ┌─────────┴─────────────┐      ┌───────────┴─────────────┐//  │                       │      │                         │{'A'},{'C'},{'E'},{'G'}}; for(char x: tree->traverse_inorder())std::cout<< x<<' ';std::cout<<'\n';}

      Output:

      A B C D E F G

      [edit]References

      • C++23 standard (ISO/IEC 14882:2024):
      • 26.8 Range generators [coro.generator]

      [edit]See also

      creates a coroutine handle that has no observable effects when resumed or destroyed
      (function)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/coroutine/generator&oldid=178286"

      [8]ページ先頭

      ©2009-2025 Movatter.jp