当前位置: 首页 > news >正文

switch case加宏实现协程类似的操作

代码

#include<iostream>#include<string>#defineXX_BEGIN(lineNumber)\switch(lineNumber){case0:#defineXX_YIELD(lineNumber)\lineNumber=__LINE__;return;case__LINE__:#defineXX_YIELD_F(lineNumber)\lineNumber=__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_B(lineNumber)\lineNumber=__LINE__;returnfalse;case__LINE__:#defineXX_YIELD_I(lineNumber)\lineNumber=__LINE__;return0;case__LINE__:#defineXX_YIELD_Z(lineNumber)\lineNumber=__LINE__;return0;case__LINE__:#defineXX_YIELD_TO_BEGIN(lineNumber)\lineNumber=0;return;#defineXX_YIELD_F_TO_BEGIN(lineNumber)\lineNumber=0;returnfalse;#defineXX_YIELD_B_TO_BEGIN(lineNumber)\lineNumber=0;returnfalse;#defineXX_YIELD_I_TO_BEGIN(lineNumber)\lineNumber=0;return0;#defineXX_YIELD_Z_TO_BEGIN(lineNumber)\lineNumber=0;return0;#defineXX_END(lineNumber)\lineNumber=0;}#defineXX_END_F(lineNumber)\lineNumber=0;}returntrue;#defineXX_END_I(lineNumber)\lineNumber=0;}return1;structTaskVoid{intlineNumber{};voidUpdate(){XX_BEGIN(lineNumber)std::cout<<"[TaskVoid] 步骤1:初始化\n";XX_YIELD(lineNumber)std::cout<<"[TaskVoid] 步骤2:处理中\n";XX_YIELD(lineNumber)std::cout<<"[TaskVoid] 步骤3:完成\n";XX_END(lineNumber)}};structTaskBool{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout<<"[TaskBool] 阶段A\n";XX_YIELD_F(lineNumber)std::cout<<"[TaskBool] 阶段B\n";XX_YIELD_F(lineNumber)std::cout<<"[TaskBool] 阶段C:全部完成\n";XX_END_F(lineNumber)}};structTaskInt{intlineNumber{};intUpdate(){XX_BEGIN(lineNumber)std::cout<<"[TaskInt] 第1帧\n";XX_YIELD_I(lineNumber)std::cout<<"[TaskInt] 第2帧\n";XX_YIELD_I(lineNumber)std::cout<<"[TaskInt] 第3帧:结束\n";XX_END_I(lineNumber)}};structTaskLoop{intlineNumber{};intcount{};voidUpdate(){XX_BEGIN(lineNumber)std::cout<<"[TaskLoop] 循环第"<<++count<<"次:步骤A\n";XX_YIELD(lineNumber)std::cout<<"[TaskLoop] 循环第"<<count<<"次:步骤B\n";XX_YIELD(lineNumber)std::cout<<"[TaskLoop] 循环第"<<count<<"次:步骤C,本轮结束,回到开头\n";XX_END(lineNumber)}};structTaskBoolLoop{intlineNumber{};intround{};boolUpdate(){XX_BEGIN(lineNumber)std::cout<<"[TaskBoolLoop] 第"<<++round<<"轮 步骤1\n";XX_YIELD_F(lineNumber)std::cout<<"[TaskBoolLoop] 第"<<round<<"轮 步骤2\n";XX_END(lineNumber)returnfalse;}};structNPC{intlineNumber{};boolUpdate(){XX_BEGIN(lineNumber)std::cout<<"[NPC] 开始巡逻...\n";XX_YIELD_F(lineNumber)std::cout<<"[NPC] 继续巡逻...\n";XX_YIELD_F(lineNumber)std::cout<<"[NPC] 发现敌人!准备攻击\n";XX_YIELD_F(lineNumber)std::cout<<"[NPC] 攻击!\n";XX_YIELD_F(lineNumber)std::cout<<"[NPC] 攻击完成,返回巡逻\n";XX_END_F(lineNumber)}};staticvoidprintSep(conststd::string&title){std::cout<<"\n========== "<<title<<" ==========\n";}intmain(){printSep("演示1: void 协程 (XX_YIELD)");{TaskVoid task;for(intframe=1;frame<=4;++frame){std::cout<<"-- 第"<<frame<<"帧 --\n";task.Update();}}printSep("演示2: bool 协程 (XX_YIELD_F / XX_END_F)");{TaskBool task;booldone=false;intframe=0;while(!done){++frame;std::cout<<"-- 第"<<frame<<"帧 --\n";done=task.Update();std::cout<<" 返回值: "<<(done?"true(完成)":"false(继续)")<<"\n";}}printSep("演示3: int 协程 (XX_YIELD_I / XX_END_I)");{TaskInt task;intret=0;intframe=0;while(ret==0){++frame;std::cout<<"-- 第"<<frame<<"帧 --\n";ret=task.Update();std::cout<<" 返回值: "<<ret<<(ret?"(完成)":"(继续)")<<"\n";}}printSep("演示4: 循环协程 (XX_END 重置 + 循环调用)");{TaskLoop task;for(intframe=1;frame<=7;++frame){std::cout<<"-- 第"<<frame<<"帧 --\n";task.Update();}}printSep("演示5: bool 循环协程");{TaskBoolLoop task;for(intframe=1;frame<=6;++frame){std::cout<<"-- 第"<<frame<<"帧 --\n";booldone=task.Update();std::cout<<" 返回值: "<<(done?"true":"false")<<"\n";}}printSep("演示6: NPC 状态机协程");{NPC npc;booldone=false;intframe=0;while(!done){++frame;std::cout<<"-- 帧"<<frame<<" --\n";done=npc.Update();}std::cout<<"NPC 行为序列结束\n";}return0;}

输出

==========演示1: void 协程(XX_YIELD)==========-- 第1帧 --[TaskVoid]步骤1:初始化 -- 第2帧 --[TaskVoid]步骤2:处理中 -- 第3帧 --[TaskVoid]步骤3:完成 -- 第4帧 --[TaskVoid]步骤1:初始化==========演示2: bool 协程(XX_YIELD_F / XX_END_F)==========-- 第1帧 --[TaskBool]阶段A 返回值: false(继续)-- 第2帧 --[TaskBool]阶段B 返回值: false(继续)-- 第3帧 --[TaskBool]阶段C:全部完成 返回值: true(完成)==========演示3: int 协程(XX_YIELD_I / XX_END_I)==========-- 第1帧 --[TaskInt]第1帧 返回值:0(继续)-- 第2帧 --[TaskInt]第2帧 返回值:0(继续)-- 第3帧 --[TaskInt]第3帧:结束 返回值:1(完成)==========演示4: 循环协程(XX_END 重置 + 循环调用)==========-- 第1帧 --[TaskLoop]循环第1次:步骤A -- 第2帧 --[TaskLoop]循环第1次:步骤B -- 第3帧 --[TaskLoop]循环第1次:步骤C,本轮结束,回到开头 -- 第4帧 --[TaskLoop]循环第2次:步骤A -- 第5帧 --[TaskLoop]循环第2次:步骤B -- 第6帧 --[TaskLoop]循环第2次:步骤C,本轮结束,回到开头 -- 第7帧 --[TaskLoop]循环第3次:步骤A==========演示5: bool 循环协程==========-- 第1帧 --[TaskBoolLoop]第1轮 步骤1 返回值:false-- 第2帧 --[TaskBoolLoop]第1轮 步骤2 返回值:false-- 第3帧 --[TaskBoolLoop]第2轮 步骤1 返回值:false-- 第4帧 --[TaskBoolLoop]第2轮 步骤2 返回值:false-- 第5帧 --[TaskBoolLoop]第3轮 步骤1 返回值:false-- 第6帧 --[TaskBoolLoop]第3轮 步骤2 返回值:false==========演示6: NPC 状态机协程==========-- 帧1 --[NPC]开始巡逻... -- 帧2 --[NPC]继续巡逻... -- 帧3 --[NPC]发现敌人!准备攻击 -- 帧4 --[NPC]攻击! -- 帧5 --[NPC]攻击完成,返回巡逻 NPC 行为序列结束

https://godbolt.org/z/hEb4aM6jW

http://www.jsqmd.com/news/551129/

相关文章:

  • 从零开始的web开发03
  • Asian Beauty Z-Image Turbo 建筑概念设计展:未来都市与奇幻场景生成
  • 2026年3月进口水性漆厂家推荐,进口环保水性漆、进口水性油漆、进口水性金属漆,低VOC高附着力源头厂商精选 - 品牌企业推荐师(官方)
  • GHelper:华硕笔记本的轻量级性能管家,告别臃肿拥抱自由
  • 保姆级教程:从下载到汉化,手把手搞定AD20安装与激活(附资源包)
  • 告别爆显存!WuliArt Qwen-Image Turbo优化实测:小显卡也能畅玩文生图
  • 拼多多API授权实战:从OAuth2.0到access_token的全流程解析
  • 阿里CosyVoice3声音克隆实战:从部署到生成,小白也能轻松上手
  • HsMod炉石传说插件:让游戏体验个性化的实用指南
  • Magisk终极实战指南:Android系统Root权限的完整解决方案
  • Audacity:音频创作的颠覆性工具与效率革命
  • Qt6开发环境搭建避坑指南:为什么你的Kit里没有MSVC2019?两种情况的解决方案都在这
  • 3个技巧让Mac窗口管理效率翻倍:Loop终极指南
  • 3分钟零配置:在浏览器中直接查看SQLite数据库的纯前端方案
  • PhysX源码分析——RigidBody:刚体的数据结构
  • Java基于微信小程序的学生签到系统,附源码+文档说明
  • 数据集资源
  • AI视频增强技术全解析:从问题诊断到实战优化的完整指南
  • 赤子城科技年营收69亿:同比增35% 经调整EBITDA为12亿
  • Source Han Serif CN:跨媒介设计的专业中文字体解决方案
  • 别再只盯着代码了!手把手教你读懂Cartographer的PGM和YAML地图文件(附Notepad++实操)
  • 3分钟掌握:如何用MacBook触控板实现精准称重功能
  • libevent bufferevent原理与嵌入式网络通信实践
  • Stable-Diffusion-v1-5-archive生产环境部署:异常自动拉起+日志监控+多用户隔离方案
  • NOJ编程竞赛中的五大常见错误类型及高效调试技巧
  • PhysX源码分析——约束求解器:物理世界的法官
  • QuickRecorder:基于ScreenCapture Kit的macOS录屏解决方案
  • 历史首次!百度智能云首席数字发言官ViviDora惊艳亮相博鳌亚洲论坛
  • 2026年3月进口木器漆厂家推荐,进口水性木器漆、进口木器漆色浆、进口水性木器漆乳液、进口油性木器漆,环保高附着力涂装解决方案实力厂商 - 品牌企业推荐师(官方)
  • 终极AI肖像动画指南:如何使用LivePortrait让静态照片瞬间“活“起来