首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么C++17中没有std::future::then?

C++17中没有std::future::then的原因是因为C++标准委员会认为将异步任务的连续执行与future对象的职责混合在一起会导致代码变得复杂且难以理解。因此,他们决定将这种功能从C++标准库中移除。

虽然C++17标准库中没有提供std::future::then函数,但可以通过其他方式实现类似的功能。例如,可以使用std::async函数结合std::future和std::packaged_task来实现异步任务的连续执行。具体实现方式如下:

代码语言:cpp
复制
#include <iostream>
#include <future>

// 定义一个异步任务
int task1(int x) {
    return x * 2;
}

// 定义另一个异步任务
int task2(int x) {
    return x + 3;
}

int main() {
    // 创建一个异步任务,并获取其future对象
    std::future<int> future1 = std::async(task1, 5);

    // 使用future的get函数获取异步任务的结果
    int result1 = future1.get();

    // 将结果传递给另一个异步任务,并获取其future对象
    std::future<int> future2 = std::async(task2, result1);

    // 使用future的get函数获取另一个异步任务的结果
    int result2 = future2.get();

    // 输出最终结果
    std::cout << "Final result: " << result2 << std::endl;

    return 0;
}

在上述代码中,我们使用std::async函数创建了两个异步任务task1和task2,并通过std::future对象获取它们的结果。通过将一个任务的结果传递给另一个任务,我们实现了异步任务的连续执行。

需要注意的是,上述代码只是一种实现方式,具体的实现方式可以根据实际需求和代码结构进行调整。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 MyBatis 源码没有我那种 if···else

在MyBatis的两万多行的框架源码,使用了大量的设计模式对工程架构的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。 经过整理,大概有以下设计模式,如图1所示。...它的核心目的是不希望把过多的关于对象的属性设置写到其他业务流程,而是用建造者方式提供最佳的边界隔离。...场景介绍:没有代理模式就不存在各类框架。...装饰器模式:是一种结构型设计模式,允许将对象放入包含行为的特殊封装对象, 为元对象绑定新的行为。...迭代器模式:是一种行为型模式,能在不暴露集合底层表现形式的情况下遍历集合的所有元素。

18810

为什么 MyBatis 源码没有我那种 if···else

在MyBatis的两万多行的框架源码,使用了大量的设计模式对工程架构的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。 经过整理,大概有以下设计模式,如图1所示。...它的核心目的是不希望把过多的关于对象的属性设置写到其他业务流程,而是用建造者方式提供最佳的边界隔离。...场景介绍:没有代理模式就不存在各类框架。...装饰器模式:是一种结构型设计模式,允许将对象放入包含行为的特殊封装对象, 为元对象绑定新的行为。...迭代器模式:是一种行为型模式,能在不暴露集合底层表现形式的情况下遍历集合的所有元素。

21920
  • 为什么查看的ARP表项没有VLAN信息?

    1 为什么查看的ARP表项没有VLAN信息?...如果ARP表项没有VLAN信息,那么代表这条表项的接口处于三层模式,是一个三层口; 如果ARP表项有VLAN信息(并且表项接口不是三层子接口时),那么代表这条表项的接口处于二层模式,是一个二层口...例如回显IP地址为10.1.1.3,MAC地址为0023-0045-0067,该ARP表项是静态配置的,出接口是10GE1/0/3,VLAN编号是101。...例如回显IP地址为10.1.1.4,MAC地址为0025-9e95-7c32,该ARP表项是从接口10GE1/0/13动态学习到,剩余存活时间是3分钟。...例如回显IP地址为10.1.1.5,MAC地址为306b-2079-2202,该ARP表项类型为I,表示IP地址10.1.1.5是接口10GE1/0/14的IP地址。

    1.9K20

    并发编程(从C++11到C++17)

    并尽可能涉及C++11,C++14以及C++17的主要内容。 为什么要并发编程 大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。...std=c++xx告知编译器,例如: g++ -std=c++17 your_file.cpp -o your_program 测试环境 本文的源码可以到下载我的github上获取,地址:paulQuei...请思考一下,为什么要在main函数创建once_flag flag。如果是在worker函数中直接声明一个once_flag并使用行不行?为什么?...它会返回一个future对象。future用来存储异步任务的执行结果,关于future我们在后面packaged_task的例子再详细说明。在这个例子我们仅仅用它来等待任务执行完成。...如果真的需要在多个线程获取future的结果,可以使用shared_future。 并行算法 从C++17开始。和 头文件的的很多算法都添加了一个新的参数:sequenced_policy。

    816130

    《C++并发编程实战》读书笔记(5):设计并发代码

    2、以递归的方式划分数据,例如快排每次以某元素为界将数据集划分为大小两部分然后再递归处理。3、依据工作类别划分任务,每部分代码只承担单一的功能职责。...::future > new_lower = new_lower_chunk.promise.get_future(); chunks.push...3、不经意共享,多个线程访问同一个数据的不同元素时可能访问同一个缓存块,造成数据乒乓;C++17定义了std::hardware_destructive_interference_size用于表示一个字节数的限度...4、数据的紧凑程度,单个线程访问的数据可能属于不同内存块,C++17定义了std::hardward_constructive_interference_size表示同一缓存块保证容纳的最大连续字节数。...::promise在工作线程设定最终结果,查找到后设置原子变量done_flag终止其他线程。

    23920

    c++17好用的新特性总结

    有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang 在C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...平时代码可以大规模使用的一个特性。其实对于string的争论一直没有停止过,很多人认为string是字节串而不是字符串,因为string是可以改变的,这一切争论到C++17可以停止了。...具体可查看这篇文章《C++17std::any》 std::optional std::optional代表一个可能存在的T值,对应Haskell的Maybe和Rust/OCaml的option...需要注意的是,c++17只提供了一个库级别的variant实现,没有对应的模式匹配(Pattern Matching)机制,而最接近的std::visit又缺少编译器的优化支持,所以在c++17std...具体可参考: 《[译]C++17,标准库新引入的并行算法 》 《STL并行算法库》 其他特性: 除此之外,C++17还增加了一些其他特性,文中没有一一列出。

    3.3K10

    《你不知道的JavaScript》:js为什么没有类?

    类--是一种代码的组织结构形式,是一种在软件对真实世界问题领域的建模方法。类有三个核心概念:封装、继承和多态。...在软件,对不同的交通工具重复定义载人能力等方法是没有意义的,只要在Vehicle类定义一次,然后在Car类时,只要声明它继承(或扩展)了Vehicle类的基础定义就行。...这里要注意,尽管Vehicle类和Car类都会定义相同的方法,但实例的数据可能是不同的。比如每辆车的识别码等。 这就可以看出,类的继承和实例化。...在javascript也有类似的语法,但是和传统的类完全不同。 js只有对象,没有类这个概念。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例。类被继承时,行为也会被复制到子类。...将函数Fn的this绑定到新创建的对象obj上面。showName是实例方法。这里就涉及到原型链了,下篇来看原型。

    1.7K30

    c++的lambda使用注意事项,可能导致的崩溃问题分析

    这里总结下Lambda表达式的使用注意事项,避免在使用的一些陷阱。...Lambda介绍 “Lambda表达式是现代C++在C ++ 11和更高版本的一个新的语法糖 ,在C++11、C++14、C++17和C++20Lambda表达的内容还在不断更新。...::vector>; FilterContainer filters; // 含有过滤函数的容器 void addDivisorFilter...好在C++17增加了新特性可以捕获*this,不持有this指针,而是持有对象的拷贝,这样生命周期就与对象的生命周期不相关,使用上就安全一些。...lambda 函数需要注意的点_风竹夜的博客-CSDN博客 C++ 从Lambda的使用到对C++闭包语法的理解/Lambda的坑_WhiteTian的博客-CSDN博客_c++闭包 c++14新特性_C+

    4K10

    C++17 在业务代码中最好用的十个特性

    < value << std::endl;     }(); } 另外这条限制在 c++20 已经被删除,所以在 c++20 标准 gcc 和 clang 都可以捕获结构化绑定的对象了。...,因为参数列表key和value是分开的 m.try_emplace("c", 10, 'c') 同时,c++17 还给std::map/unordered_map加入了insert_or_assign...std::optional std::optional代表一个可能存在的 T 值,对应 Haskell 的Maybe和 Rust/OCaml 的option,实际上是一种Sum Type。...return {ret}; } 需要注意的是,c++17 只提供了一个库级别的 variant 实现,没有对应的模式匹配(Pattern Matching)机制,而最接近的std::visit又缺少编译器的优化支持...,所以在 c++17 std::variant并不好用,跟 Rust 和函数式语言中出神入化的 Sum Type 还相去甚远,但是已经有许多围绕std::variant的提案被提交给 c++委员会探讨

    2.6K20

    C++17, 语言核心层有哪些新的变化?

    22行和23行代码从C++第一个标准开始(C++98)便是合法的,但是25行及26行代码则只能在C++17编译通过,因为在C++17之前,你必须使用尖括号()来指定需要实例化的类模板的类型参数....,但RVO一直都只是一种可能优化步骤(并没有标准规范,编译器可以选择进行RVO或者不进行RVO),C++17通过定义 guaranteed copy elision 保证了这种优化的执行....copy with C++17 在这几行代码的执行可能会发生2次不必要的复制操作.第1次发生在第3行,第2次则发生在第6行.但在C++17,这2次多余的复制操作都(保证)不会发生....).正因为 std::auto_ptr 的这个缺陷, C++11 作为替代引入了不可复制(只可移动)的 std::unique_ptr. std::auto_ptr ap1(new int(...,但译文中的示例代码并没有行号显示,原因是自己未找到markdown源码显示行号的简易方法,有知道的朋友可以告诉一声)

    83020

    【DB笔试面试565】在Oracle为什么索引没有被使用?

    ♣ 题目部分 在Oracle为什么索引没有被使用? ♣ 答案部分 “为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。...还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)“文档1549181.1为何在查询索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOG(...二、索引本身的问题 n 索引的索引列是否在WHERE条件(Predicate List)? n 索引列是否用在连接谓词(Join Predicates)?...n 在总体成本,表扫描的成本是否占大部分? n 访问空索引并不意味着比访问有值的索引高效? n 参数设置是否正确? 四、其它问题 n 是否存在远程表(Remote Table)?

    1.2K20

    C++17常用新特性

    1 C++17 介绍 每次C++版本的发布都会带来很多新的特性,C++17也不例外,虽然有很多期待的特性没有包含进来,但是新增的特性依然挡不住它独特的魅力。...2 C++17新特性 2.1 折叠表达式 从C++17开始,可以使用二元操作符对形参包的参数进行计算,这一特性主要针对可变参数模板进行提升,可以分为左折叠和右折叠。支持的二元操作符多达32个。...不过这一特性在C++20已经被支持进来。C++17支持的类型包括:左值引用,整数,指针类型,成员指针类型,枚举。...在C++17,noexcept(true)相当于之前的throw(); void f() noexcept; void f() noexcept(false); 2.11 lambda表达式捕获*this...i = 42 3 总结 对于C++17新增特性很多编译器已经都能够进行支持,当然在C++17版本规划的内容也不止上面说的这些,如果大家有需要补充或者对上述内容进行指正的欢迎大家留言。

    2.3K20

    C++避坑---函数参数求值顺序和使用独立语句将newed对象存储于智能指针

    为什么C++不把顺序规定清楚呢?实际上这是C++设计者故意而为之的,因为C++在平衡功能的同时,还要追求高的执行效率。...(std::shared_ptr pw, int priority); 如果采用下面的方法传参并调用processWidget函数,在C++17以前,则有可能造成资源泄漏。...代码实现如下: std::shared_ptr pw(new Widget()); processWidget(pw, priority()); 这样的实现,就是利用了编译器对于跨越语句的各项操作没有重新排列的自由...C++17带来的好消息 在上一章节,我们提到processWidget(std::shared_ptr(new Widget()), priority());语句可能带来内存泄漏的风险...也就是说,从C++17起,对于 processWidget(std::shared_ptr(new Widget()), priority()); 不允许编译器采用1、3、2的那种顺序

    52310

    为什么 CSS flex 布局没有 `justify-items` 和 `justify-self`?

    为什么 CSS flex 布局没有 justify-items 和 justify-self?...为什么在 CSS flex 布局存在 align-items 和 align-self,却没有 justify-items 和 justify-self 呢?...主轴和交叉轴的区别 在没有折行的情况下,一个 flex 容器(flex container)只有一个主轴,但却有 n 个交叉轴(n 代表 flex item的数量)。...CSS 属性的命名规则 2.1 align-* 和 justify-* 在 CSS flex 布局,属性名称的 justify-* 表示这是应用于主轴上的规则,而 align-* 表示这是应用于交叉轴上的规则...总结 因此,在 flex 布局,我们不能使用 justify-items,因为多个元素共享一个轴,它们属于同一组,这会导致相互干扰。

    38430

    C++那些事之string那些事

    然而,C++标准库在C++17和C++20引入了更有用的组件,可以帮助你编写更高效的代码。...在C++20,引入了char8_t,这也带来了std::u8string(即std::basic_string)。...我不知道为什么要等到C++20才引入char8_t,那么提个问题char16_t和char32_t在哪个标准存在呢?留言区见 注:本篇文章的所有代码已同步至星球,更多优质内容一起探讨。...<< std::endl; return 0; } C++17C++17,引入了头文件,提供了一种轻量级的只读替代方案,用于使用头文件的字符串类型。...printString函数以std::string_view作为参数,这使得这个函数非常轻量级和灵活,因为没有制作任何字符串的副本,这个函数可以通过传递C和C++样式的字符串以各种方式使用。

    39010
    领券