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

使用std::future的不完整类型的使用无效

是指在使用std::future时,如果使用了不完整类型(incomplete type),则无法正确地使用std::future的功能。

不完整类型是指在某个特定的上下文中,类型的定义不完整或者不可见。这可能是因为类型的定义在当前的编译单元中不存在,或者是因为类型的定义在当前的编译单元中尚未完成。

在使用std::future时,我们通常会使用std::async函数来创建一个异步任务,并返回一个std::future对象,以便在将来的某个时间点获取异步任务的结果。然而,如果异步任务的返回类型是一个不完整类型,那么std::future将无法正确地处理这个类型。

这是因为std::future需要在编译时确定返回类型的大小和布局,以便正确地分配内存和管理异步任务的结果。如果返回类型是不完整的,编译器无法确定其大小和布局,从而导致std::future无法正常工作。

为了解决这个问题,我们可以使用std::shared_future来替代std::future。std::shared_future是std::future的一种特殊形式,它可以处理不完整类型的返回值。

std::shared_future允许多个线程共享对异步任务结果的访问,并且可以在不完整类型的情况下正确地处理返回值。我们可以使用std::async函数创建一个返回std::shared_future的异步任务,并在需要的时候获取异步任务的结果。

总结起来,使用std::future的不完整类型的使用无效是因为std::future无法正确处理不完整类型的返回值。为了解决这个问题,可以使用std::shared_future来处理不完整类型的返回值。

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

相关·内容

Future使用

在开发多线程时,我们有时会需要返回子线程处理结果,但不幸是Runable接口是void类型没有返回值。有人可能会想到用实例变量方法实现此需求。...实例变量方式当然也是可以,在其它文章中已经介绍过了,在使用实例变量时要特别注意,因为实例变量有可能会出现线程安全问题。其实在Java中已经为我们提供了这样接口Callable接口。...但Callable接口还有一个更强大功能就是它支持返回类型。通过Callable接口可以返回异步执行后结果。 ? ?...ExecutorService接口submit()方法返回一个Future类型。用Future就可以获取Callable接口中异步执行后任务数据。我们看两个main线程输出时间有些不同。...这是因为当调用Future接口中get()方法时,当前线程会被阻塞,一直等待子任务结束,因为子任务中我们延迟了10秒,所以这两个输出时间有些偏差。Future接口中还有其它几个方法。 ? ?

48730
  • java中Future使用

    java中Future使用 Future是java 1.5引入一个interface,可以方便用于异步结果获取。本文将会通过具体例子讲解如何使用Future。...一般来说,当我们执行一个长时间运行任务时,使用Future就可以让我们暂时去处理其他任务,等长任务执行完毕再返回其结果。 经常会使用Future场景有:1. 计算密集场景。2. 处理大数据量。...接下来我们将会使用ExecutorService来创建一个Future。...这里我们使用lamaba表达式来简化这一个流程。 从Future获取结果 上面我们创建好了Future,接下来我们看一下怎么获取到Future值。...is done and future2 is not done 100 and 10000 如果我们使用Executors.newFixedThreadPool(2)来创建一个多线程池,则可以得到如下结果

    3.7K60

    如何优雅使用 std::variant 与 std::optional

    它还有一个特殊类型 std::nullopt_t, 这个类型std::nullptr_t一样, 只有一个值, std::nullopt, optional在没有设置值情况下类型就是std::nulopt_t...:variant中包含类型较多时候, 业务代码写起来会特别的费力, 标准库提供了通过std::visit来访问variant方式, 这也是大多数库对variant应用所使用方式....对比简单get方式来说, std::visit相对来说能够更好适配各个使用场合(比如ponder[一个开源C++反射库]中作为统一类型ponder::Value对象就提供了不同种类vistor..., 重载参数类型决定调用分支, 存储类型与目标值不一致时候, 会直接使用ponder_ext中封装ValueMapper来完成U到T转换(转换失败会直接抛异常)....与operator<()实现基本类似. 3.2. overloads方式访问std::variant 除了上述介绍方法, 有没有更优雅使用std::visit方式呢?

    3.5K10

    高效使用stl::map和std::set

    1、低效率用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 } else {     // 不存在时处理 } 2、高效率用法...// 解决办法,充分利用insert和erase返回值,将find次数降为1 map::size_type num_erased = map.erase(X); // 需要find一次 if (0...== num_erased) {     // 不存在时处理 } else {     // 存在且删除后处理 } pair result_inserted; result_inserted = map.insert...(X); if (result_inserted.second) {     // 不存在,插入成功后处理 } else {     // 已经存在,插入失败后处理     result_inserted.first

    2.9K20

    在耗时较长Controller中使用Future异步

    Thread.sleep(2000); return midog; } }; return dog; } } 这里我们使用了两种方式来获取一条狗名字和年龄...第一种是最传统单线程返回。第二种采用了Future模式异步返回。我们对性能进行一次压测,压测线程数1000,循环5次,共5000次。 ? 我们先来压第一个getdog ? 压测结果如下 ?...原因主要在于单线程程序一条道走到黑,不运行完绝不撒手,Tomcat可用线程被完全霸占。...而Future模式异步调用则是另外启动一个线程将Callable交给TaskExecutor去处理,Tomcat自己主线程退出,去重新接收其他请求调用,等到Callable执行结束后,就会重新启动分配一个...但这里有一点需要说明,当一个请求处理及其短时间时候,不要使用Future模式异步调用,性能反而不如单线程模式。

    1.1K20

    使用Photoshop合成两张不完整图片

    一、准备工作 软件环境:PhotoshopCS6 目标:将两张不完整图片合并成一张完整图片。 二、操作步骤 1,新建一张画布,参数:15*12厘米,像素300。...2,对第一张不完整图片选择魔棒工具,容差值为10,然后在上方菜单栏中点击 选择->反向。如图,我们已经选中了该图片。 3,在菜单栏中点击 编辑->自由变换,角度选 -3度,然后提交。...4,在菜单栏中点击 编辑->拷贝,并将已摆正图片粘贴到新建画布中。 5,对另一张图片重复2~4步骤,最后效果如下: 注意:根据另一张图片情况,容差应选为2,旋转角度为 3度。...6,使用左栏移动工具对图片进行校准,对齐。最后拼接后效果如下: 提示:此处建议去键盘移动,鼠标太灵活,不好控制。 7,两个图层进行合并。对图层2右击 ->向下合并。...8,使用左栏裁剪工具,只保留照片本身。 9,这时我们发现,在图片中央还有一道线。所以我们使用修复画笔工具去掉中间那条线。 提示:动作一定要慢,注意细节处理。

    1K20

    Java多线程开发 - Future使用与理解

    著作权归作者所有,任何形式转载都请联系作者获得授权并注明出处。 Future模式是什么 Future模式是多线程开发中非常常见一种设计模式。它核心思想是异步调用。当我们需要调用一个函数方法时。...使用Future模式,获取数据时候无法立即得到需要数据。而是先拿到一个契约,你可以在将来需要时候再用这个契约去获取需要数据,这个契约就好比叫外卖例子里外卖订单。...普通方式和Future模式区别 我们可以看一下使用普通模式和用Future模式时序图。可以看出来普通模式是串行,在遇到耗时操作时候只能等待。...在工作线程准备好数据之后可以使用setData方法将数据传入。...实际上submit方法就是使用Future模式: Future submit(Runnable task) : 它返回值实际上是Future,子线程是不会返回数据

    1.6K10

    Java中Future使用场景和解析

    我们通常都是开启一个新子线程去执行比较耗时代码,这使用起来非常简单,只需要将耗时代码封装在Runnable中run()方法里面,然后调用thread.start()就行。...这个时候Future作用就发挥出来了。 Future如何使用能够获取子线程运行结果呢?在这里顺便提一下Callable接口,Callable产生结果,Future获取结果。...如何使用他们两个来获取子线程运行结果呢?我们先来看个简单例子。...,如果不使用Future,并且依赖线程结果,我们可能需要时间可能是需要5s(子线程2s+主线程3s)。...1,先看看类FureTask类关系图 FutureTask实现了RunnableTask接口,RunnableTask继承了Runnable和Future接口(接口是支持多继承) 2,t1.start

    35220

    类型安全瑞士军刀——std::variant

    前言 当需要在同一块内存区域中存储不同类型值且在任何时刻只会存储其中一种类型时,联合体(union)总是作为首要选择,但是联合体存在如类型安全差、不支持构造函数和析构函数等缺点。...std::variant作为一个多形态容器,可以容纳一组预定义类型其中之一,任何时候它都只存储其中一个类型有效值,提供了严格类型安全保证。 联合体通过.指定变量名进行变量存取,如下示例代码1。...// 通过index()函数获取当前存储值类型索引 if (myVariant.index() == 0) { std::cout << "当前存储是int类型" << std...读——使用std::visit函数 std::visit函数为了更加安全地处理std::variant中值,它接受一个可调用体(callable,函数对象/lambda表达式/std::function...)和一个std::variant实例,根据variant中实际存储类型调用访问者相应重载方法。

    8610

    解决innerHtml 在Jquery上使用无效问题

    ' + loadTime + 'ms'); innerHTML在JQuery中使用的话是无效, JQuery提供了三种方法实现指定标签赋内容:.html(),.val(),.text()。...三种方法区别具体: .html()用为读取和修改元素HTML标签 对应js中innerHTML .html()是用来读取元素HTML内容(包括其Html标签), .html()方法使用在多个元素上时...,只读取第一个元素:( 这句话实测是一个标签使用了多个.html()时,只有第一个.html()有效,假如一个标签同时使用了.html(),.text()也是第一个有效) .text()用来读取或修改元素纯文本内容...对应js中innerText text()用来读取元素纯文本内容,包括其后代元素;.text()方法不能使用在表单元素上 .val()用来读取或修改表单元素value值 .val()是用来读取表单元素....html(),.text(),.val()都可以使用回调函数返回值来动态改变多个元素内容。**

    41310
    领券