C++20-协程

news/2024/9/25 13:53:47/

昨天看到一本书,《现代C++语言核心特性解析》,第33章是协程,我机器上安装了vs2022,肯定是支持的,直接运行第一个例子就报错了。

#include <iostream>
#include <chrono>
#include <future>using namespace std::chrono_literals;std::future<int> foo()
{std::cout << "call foo\n";std::this_thread::sleep_for(3s);co_return 5;
}std::future<std::future<int>> bar()
{std::cout << "call bar\n";std::cout << "before foo\n";auto n = co_await std::async(foo);       // 挂起点std::cout << "after foo\n";co_return n;
}int main()
{std::cout << "before bar\n";auto i = bar();std::cout << "after bar\n";i.wait();std::cout << "result = " << i.get().get();
}

显示少了#include <coroutine>,加上后不行,又把项目的C++语言设置为C++20,缺省是C++14。

然后报如下错误:

错误    C2039    "promise_type": 不是 "std::coroutine_traits<std::future<int>>" 的成员    testco    C:\cpp\vc2022\testco\testco\co1.cpp    13

“promise_type”: is not member of “std::experimental::coroutine_traits<void>

搜了一大圈不明就里,现在搜索质量真是差。

暂时放弃了。

晚上在B站浏览协程相关内容,发现一哥们讲的通俗易懂,就去了他的代码:

#include <coroutine>
#include <iostream>
#include <chrono>
#include <future>
#include <thread>using namespace std::chrono_literals;void Fun() {std::cout << 1 << std::endl;std::cout << 2 << std::endl;std::cout << 3 << std::endl;std::cout << 4 << std::endl;
}struct Result {struct promise_type {std::suspend_never initial_suspend() {return {};}std::suspend_never final_suspend() noexcept {return {};}Result get_return_object() {return {};}void return_void() {}void unhandled_exception() {}};
};struct Awaiter {int value;bool await_ready() {return false;}void await_suspend(std::coroutine_handle<> coroutine_handle) {std::async([=]() {std::this_thread::sleep_for(1s);coroutine_handle.resume();});}int await_resume() {return value;}
};Result Coroutine() {std::cout << 1 << std::endl;std::cout << co_await Awaiter{ .value = 1000 } << std::endl;std::cout << 2 << std::endl;std::cout << 3 << std::endl;co_await std::suspend_always{};std::cout << 4 << std::endl;co_return;
};int main() {Coroutine();return 0;
}

这个代码可以跑,找到了这个兄弟的网站,慢慢了解一下C++协程

1. C++ 协程概览 | Benny Huo 的专栏

当然还有个比较令人烦闷的事情,VS2022里面,std::suspend_never,std::coroutine_handle,co_await编辑器都标识为错误,这是为啥,VS2022不是号称支持C++20吗? 当然可以编译运行,就是编辑器总是提示错误。谁知道如何化解?


http://www.ppmy.cn/news/1530312.html

相关文章

redis常见类型设置、获取键值的基础命令

redis常见类型设置、获取键值的基础命令 获取键值的数据类型 命令&#xff1a;TYPE keyname 常见数据类型设置、获取键值的基本命令 string类型 置键值&#xff1a;set keyname valuename获取键值&#xff1a;get keyname删除&#xff1a; del keyname list类型 从左边向列表…

基于Spring Boot的宠物咖啡馆平台【附源码】

基于Spring Boot的宠物咖啡馆平台&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 …

charles抓包flutter

一&#xff0c;准备工作 在我的另一篇文章flutter Dio发送post请求-CSDN博客里面&#xff0c;直接复用一部分代码 该方法无需让手机安装charles的ca证书&#xff08;当然安装了也没事儿&#xff09;&#xff0c;也无需设置手机wifi的网络代理&#xff08;因为ca证书的内容和网…

移动学习平台的设计与实现+ssm论文源码调试讲解

第2章 开发环境与技术 基于微信小程序的移动学习平台的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对基于微信小程序的移动学习平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;…

CaLM 因果推理评测体系:如何让大模型更贴近人类认知水平?

CaLM 是什么 CaLM&#xff08;Causal Evaluation of Language Models&#xff0c;以下简称“CaLM”&#xff09;是上海人工智能实验室联合同济大学、上海交通大学、北京大学及商汤科技发布首个大模型因果推理开放评测体系及开放平台。首次从因果推理角度提出评估框架&#xff…

Java并发编程 第八章 共享模型之工具

1. AQS原理 aqs全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架 特点&#xff1a; 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#xff0c;子类需要定义如何维护这个状态&#xff0c;控制…

零基础学Axios

Axios官网&#xff1a;Axios官网 想用Axios前需要在项目中安装axios,安装方式如下&#xff1a; 下列是axios请去方式&#xff0c;本文主要讲解post和get请求&#xff0c;其他请求和这两种请求方法相同。 1 get请求 1.1 不带请求参数 前端 后端 1.2 带请求参数 前端 写法…

YOLOv8改进,YOLOv8替换主干网络为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

改进前训练结果: 改进后训练结果: 摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了 VanillaNet,一种拥抱设计优雅的神经网络架…