Something went wrong. Try again.
A Tour of C++ for experienced programmers, as if C++26 is the only version that ever existed.
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include <coroutine>#include <exception>
#include <iostream>#include <optional>
// Minimal generator that yields values of type T.// This is a book_demo: illustrative only, not for production use.
template <typename T>struct simple_generator { struct promise_type { std::optional<T> current; auto get_return_object() { return simple_generator{handle_type::from_promise(*this)}; } std::suspend_always initial_suspend() noexcept { return {}; } std::suspend_always final_suspend() noexcept { return {}; } std::suspend_always yield_value(T value) noexcept { current = std::move(value); return {}; } void return_void() noexcept {} void unhandled_exception() { std::terminate(); } };
using handle_type = std::coroutine_handle<promise_type>; handle_type coro;
explicit simple_generator(handle_type h) : coro(h) {} simple_generator(const simple_generator&) = delete; simple_generator(simple_generator&& other) noexcept : coro(other.coro) { other.coro = nullptr; } ~simple_generator() { if (coro) coro.destroy(); }
// Iterator support for range‑for. struct iterator { handle_type coro; bool done; iterator(handle_type h, bool d) : coro(h), done(d) {} iterator& operator++() { coro.resume(); done = coro.done(); return *this; } const T& operator*() const { return *coro.promise().current; } bool operator==(std::default_sentinel_t) const { return done; } };
iterator begin() { coro.resume(); return iterator{coro, coro.done()}; } std::default_sentinel_t end() const { return {}; }};
// Example: generate the first three natural numbers.simple_generator<int> numbers() { co_yield 1; co_yield 2; co_yield 3;}
int main() { for (int n : numbers()) { std::cout << n << ' '; } std::cout << '\n'; return 0;}