c++ goto实现generator

举报
lessIsBetter 发表于 2023/09/28 11:20:52 2023/09/28
【摘要】 generator的主要的效果就是产生一个输出后,停在原地,直到再次被调用。python自身就带有generator,是一个重要特性,带来了很多便捷。但是c++本身不直接支持generator。如果一定要用的话,利用goto在循环中停止,是可行的。虽然goto普遍被大家诟病,但由于c++基本语法与基础库的局限性,在产生器这种场景,也许goto还不错。#include <iostream>cl...

generator的主要的效果就是产生一个输出后,停在原地,直到再次被调用。

python自身就带有generator,是一个重要特性,带来了很多便捷。但是c++本身不直接支持generator。

如果一定要用的话,利用goto在循环中停止,是可行的。

虽然goto普遍被大家诟病,但由于c++基本语法与基础库的局限性,在产生器这种场景,也许goto还不错。

#include <iostream>

class Generator {
public:
    const std::string &Yield()
    {
        if (isFuncYieldCalled) {
            goto POS_CONTINUE;
        }
        isFuncYieldCalled = true;
        for (i = 0; i < 2; ++i) {
            for (j = 0; j < 3; ++j) {
                value = "i=" + std::to_string(i) + ",j=" + std::to_string(j);
                return value;
                POS_CONTINUE:
                continue;
            }
        }
        value = "";
        return value;
    }

    int i = 0;
    int j = 0;
    bool isFuncYieldCalled = false;
    std::string value;
};

int main()
{
    std::cout << "Hello, World!" << std::endl;
    Generator generator;

    for (auto value = generator.Yield(); !value.empty(); value = generator.Yield()) {
        std::cout << value << std::endl;
    }
    return 0;
}

输出为:

Hello, World!
i=0,j=0
i=0,j=1
i=0,j=2
i=1,j=0
i=1,j=1
i=1,j=2

Process finished with exit code 0

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。