条件标准::未来和标准::异步
Conditional std::future and std::async
我需要做条件行为。
std::future<int> f = pointer ? std::async(&Class::method, ptr) : 0;
// ... Some code
x = f.get();
所以我想将 x 结果分配给 x ptr->method()
调用的异步结果,如果 ptr
是nullptr
,则为 0
上面的代码可以吗?我可以做这样的事情吗(将"int"分配给"std::futture"?或者也许有更好的解决方案?
std::future
没有转换构造函数,因此您的代码无效(如果您实际尝试编译代码,您会注意到这一点)。
您可以做的是使用默认构造的未来,然后在使用未来之前检查它是否有效。
您可以将值加载到将来,而无需使用如下所示的线程:
std::future<int> f;
if ( pointer )
f = std::async(&Class::method, ptr);
else
{
std::promise<int> p;
p.set_value(0);
f = p.get_future();
}
// ... Some code
x = f.get();
但实现相同目标的更简单方法是:
std::future<int> f;
if ( pointer )
f = std::async(&Class::method, ptr);
// ... Some code
x = f.valid() ? f.get() : 0;
您也可以为其他情况返回std::future
(使用不同的策略):
std::future<int> f = pointer
? std::async(&Class::method, ptr)
: std::async(std::launch::deferred, [](){ return 0;});
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- C ++异步键盘输入(标准方式)
- C++17 标准::异步非阻塞执行
- 控制与标准::异步的并行度
- VS2015 标准::异步奇怪
- 我怎样才能把这个标准::函数传递给标准::异步
- 如何完成标准::异步
- 修复此标准::异步调用
- 条件标准::未来和标准::异步
- 英特尔® IPP 异步 C/C++ 库是否包含在标准 IPP 库中?