gpt4 book ai didi

c++ - Visual Studio 2013 中右值引用的初始化捕获

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:47 25 4
gpt4 key购买 nike

我想在 C++ 中使用 .net 的 System.Threading.Tasks.Task.ContinueWith,所以我编写了以下函数..

#include <iostream>
#include <functional>
#include <future>

template <typename Func, typename Ret>
auto continue_with(std::future<Ret> &&fu, Func func)
-> std::future<decltype(func(fu.get()))>
{
return std::async(
[fu = std::move(fu), func]() mutable { return func(fu.get()); }
);
}

template <typename Func>
auto continue_with(std::future<void> &&fu, Func func)
-> std::future<decltype(func())>
{
return std::async(
[fu = std::move(fu), func]() mutable { fu.get(); return func(); }
);
}

int main()
{
std::future<void> fu = std::async([]{ std::cout << "fu" << std::endl; });
std::future<void> fu2 = continue_with(
std::move(fu),
[]{ std::cout << "fu2" << std::endl; }
);
fu2.get();
std::cout << "fu continue complete" << std::endl;

std::future<int> retfu = std::async([]{ std::cout << "retfu" << std::endl; return 3; });
std::future<int> retfu2 = continue_with(
std::move(retfu),
[](int result){ std::cout << "retfu2 " << result << std::endl; return result + 1; }
);
int ret = retfu2.get();
std::cout << "retfu continue complete : " << ret << std::endl;

std::cin.get();
}

此代码适用于 gcc 4.8.2 和 -std=c++1y。 (我不知道为什么,但它也适用于 -std=c++11)

但它在 VC++ 2013 上不起作用。我猜这是因为 init-capture,一个 C++14 功能。如何使用 VC++ 2013 运行此代码?

(我想使用 lambda,所以请不要告诉我“只使用函数对象结构!”)

(我尝试了 Move capture in lambda ,但它不起作用..)

(如果您不仅回答我的问题而且改进我的代码,我将不胜感激)

最佳答案

不幸的是,此功能在 Visual Studio 2013 中尚不存在。它于 2014 年 6 月与 Visual Studio "14" CTP 一起发布(社区技术预览,它是 alpha 质量,尚未准备好用于生产代码)。引用:

Here are the improvements for Visual C++:

Generalized lambda capture: You can assign the result of evaluating an expression to a variable in the capture clause of a lambda. This allows an instance of a move-only type to be captured by value.

正如评论中所指出的:作为 Visual Studio 2013 的变通方法,您可以使用通过构造函数初始化的局部变量创建您自己的函数对象。是的,这很糟糕,但在发明 lambda 之前,它一直是标准技巧。多态 lambda 也是如此,直到它们得到支持(解决方法:具有模板化 operator() 的函数对象)和当前不允许的 constexpr lambda(解决方法:constexpr 文字类型的函数对象)。

关于c++ - Visual Studio 2013 中右值引用的初始化捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com