gpt4 book ai didi

c++ - 如何在 C++20 中获得一个运行良好的生成器类模板?

转载 作者:行者123 更新时间:2023-12-01 13:46:35 26 4
gpt4 key购买 nike

我只是一个简单的编码器,经常使用 Python 并沉迷于它的生成器。据我了解目前的情况,它们可以用协程在 C++20 中干净地实现,但是,至少在 C++23 之前,这不是一项简单的任务,因为需要编写一个生成器类(模板)。我怎样才能得到一个

  • 运行相当快(至少不比旧的 generators hack with macros 慢)
  • 我可以使用基于范围的 for ,范围库和 Python 的 next 的一些等价物在上面。如果有一种方法可以测试发电机是否耗尽,那也很棒。
  • 当(如果?)等价物被添加到标准库中时,我(很有可能)不需要过多地更改我的代码

  • 这可能吗?

    最佳答案

    如评论中所述,libcoro提供更高级别的抽象,并可能解决您的一些问题。
    对于第 2 点,如果您真的需要一个告诉您生成器已用尽的公共(public)方法,我想增强 libcoro 生成器会使其变得容易。这是一个(未经测试的)可能的样本。但是检查 generator.end() 对你来说是个问题吗?

    namespace libcoro {
    template<typename T>
    class [[nodiscard]] generator
    {
    public:

    using reference_type = std::conditional_t<std::is_reference_v<T>, T, T&>;

    //.. libcoro stuff

    // ADDED
    bool done() const {
    m_coroutine.done();
    }

    reference_type value() const {
    return m_coroutine.promise().value();
    }

    void resume() {
    m_coroutine.resume();
    }

    // ...
    };
    }
    然后你可以这样做:
    while (true) {
    gen.resume();
    if(gen.done()) {
    std::cout << "this is the end!" << std::endl;
    break;
    }
    std::cout << "new value: " << gen.value() << std::endl;
    }

    关于c++ - 如何在 C++20 中获得一个运行良好的生成器类模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63545339/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com