C++ 协程让生成器永不停止

问题描述 投票:0回答:1

您可以在以下位置查看我的示例: https://cpp.sh/?source=%2F%2F+示例+程序%0A%23include+%3Ciostream%3E%0A%23include+%3Cstring%3E%0A%0Aint+main()%0A%7B%0A ++std%3A%3Astring+名称%3B%0A++std%3A%3Acout+%3C%3C+%22什么+是+你的+名称%3F+%22%3B%0A++getline+(std%3A%3Acin% 2C+名称)%3B%0A++std%3A%3Acout+%3C%3C+%22Hello%2C+%22+%3C%3C+名称+%3C%3C+%22!%5Cn%22%3B%0A%7D

以下是代码:

    // Example program
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <coroutine>


template <typename T>
class Generator {
public:
    struct promise_type {
        T value;
        std::suspend_always yield_value(T v) { value = v; return {}; }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_never final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
        Generator get_return_object() { return Generator{ Handle::from_promise(*this) }; }
    };

    struct Handle : std::coroutine_handle<promise_type> {
        Handle(std::coroutine_handle<promise_type> h) : std::coroutine_handle<promise_type>(h) {}
        T& operator()() { return this->promise().value; }
        void operator++() { this->resume(); }
    };

    Generator(Handle h) : handle(h) {}
    ~Generator() { if (handle) handle.destroy(); }

    T& operator()() { return handle(); }
    void operator++() { ++handle; }
    explicit operator bool() { return !handle.done(); }

//private:
    Handle handle{};
};

Generator<int> generateNumbers(int start, int end) {
   for (int i = start; i <= end; ++i) {
      co_yield i;
   }
}

int main()
{
    auto gen = generateNumbers(1, 10); // Adjust the range as needed
    while (gen) {
        if(gen.handle.done()) // I also tried directly accessing the handle,  but this did also not work.
            break;
        std::cout << gen() << std::endl;
        ++gen;
    }
}

在这段代码中,我创建了一个生成器作为协程生成器类。现在我想使用这个生成器在generateNumbers函数中生成一些数字。我从 main 调用它并尝试迭代这些数字。问题是当我想检查迭代是否结束时。我尝试暂时将生成器检查为布尔值。被覆盖的布尔运算符调用handle.done(),我检查了调试器,它确实这样做了。问题是,handle.done() 总是返回 false,即使循环确实结束了。我尝试直接从循环内调用handle.done(),这也不起作用。

我正在使用支持 C++20 标准的编译器。

你能帮助我理解我的错误吗?非常感谢。

c++ generator c++-coroutine
1个回答
0
投票
如果协程在其最终暂停点暂停,则

done()
返回
true

您的

final_suspend()
返回
std::suspend_never
,因此协程不会在其最终暂停点暂停。您需要更改它才能返回
std::suspend_always

© www.soinside.com 2019 - 2024. All rights reserved.