如何将 future 移至 lambda 表达式

2024-01-06

我正在使用 Visual Studio 2013,我想实现这行代码

 f = p.get_future();
 auto task =[f = std::move(f)](){
   //use f
 };

我知道解决方案here https://stackoverflow.com/questions/8640393/move-capture-in-lambda,但不幸的是这不能在 VS2013 下编译(error C2558 no copy-constructor available).


您可以使用shared_future。那是最简单的。

然而,这并不能帮助你移动。如果您确实需要搬家,我们可以在专业人士的帮助下进行move_helper功能和类别:

template<class T, class F=void>
struct move_helper_t {
  T t;
  F f;
  template<class...Args>
  auto operator()(Args&&...args)
  ->typename std::result_of< F&(T&, Args...) >::type
  {
    return f(t, std::forward<Args>(args)...);
  }

  // force right-associativity of `->*`, and
  // invert the stack to get the arguments in the "right" order:
  template<class F1,
    class R0=move_helper_t< T, typename std::decay<F1>::type >
  >
  auto operator->*(F1&& f1)
  -> decltype(
    std::declval<F>()->*
    std::declval<R0>()
  )
  {
    return
      std::move(f)->*
      R0{ std::forward<T>(t), std::forward<F1>(f1) };
  }
};
template<class T>
struct move_helper_t<T,void> {
  T t;
  template<class F>
  auto operator->*(F&& f)
  -> move_helper_t<T, typename std::decay<F>::type>
  {
    return {std::forward<T>(t), std::forward<F>(f)};
  }
};

template<class T>
move_helper_t<std::decay_t<T>>
move_helper( T&& t ) {
  return {std::forward<T>(t)};
}

在 MSVC 2013 中,您may必须声明一个构造函数move_helper_t。我不记得他们写得有多好return {}代码是。

f = p.get_future();
task =
  move_helper(std::move(f)) ->*
  [](std::future<int>& f){
    //use f
  };

->*绑定move_helper到 lambda。然后它返回一个可调用对象,该对象将被传递给std::future<int>&作为调用时的第一个参数。

由于它的编写方式,您甚至可以将其链接起来:

auto f = p.get_future();
auto f2 = p2.get_future();
task =
  move_helper(std::move(f)) ->*
  move_helper(std::move(f2)) ->*
  [](std::future<int>& f, std::future<char>& f2){
    //use f
  };

将多个参数移至 lambda 中。

在这两种情况下,task可以通过调用task() -- the ->*操作将 lambda 绑定起来并在调用时传递 future。

实例 http://coliru.stacked-crooked.com/a/d8dbc52ac651cca7.

请注意,这解决了将 future 移入 lambda 的问题。如果你想将 lambda 存储在std::function, this 不会帮助你,因为函数必须是可复制的。

template<class F>
struct shared_function {
  std::shared_ptr<F> pf;
  template<class ...Args>
  typename std::result_of<F&(Args...)>::type
  operator()(Args&&...args) const {
   return (*pf)(std::forward<Args>(args)...);
  }
};
template<class F,
  class dF=typename std::decay<F>::type
>
shared_function< dF >
make_shared_function( F&& f ) {
  return {std::make_shared<dF>(std::forward<F>(f))};
}

这需要一个可移动的 lambda 并将其包装在一个共享指针中并公开operator()为你。但首先采取future通过上述技术将其移动到 lambda 中,然后将该 lambda 包装在共享函数中以将其传递给std::function很荒谬:只需使用shared_future首先。

顺便说一句,理论上,packaged_task只需要移动,但我不确定MSVC2013是否支持该要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 future 移至 lambda 表达式 的相关文章

随机推荐

  • Gradle 获得“sudo”权限

    我有下一个问题 我需要使用 Gradle 在服务器上执行一些部署内容 但为此 Gradle 应该在目标部署服务器上具有 root 访问权限 我有 sudo 的密码 但我不知道如何将其插入服务器 有没有办法从 Gradle 任务中获得 sud
  • 注释属性必须是类文字吗?为什么?常量也应该没问题

    有人可以解释为什么字符串和类注释参数的预期不同吗 为什么编译器需要类的文字 同时也接受字符串的常量 使用 Spring 的 RequestMapping 的工作示例 public class MyController public stat
  • UIView 动画后 UIView 内的 UIButton 不起作用

    我在这个论坛上看到了很多问题 这些问题给出了这个主题 UIButton inside a UIView when animated does not work 的答案 但是在尝试了类似的答案之后 a UIViewAnimationOptio
  • R 中的函数工厂

    我尝试通过返回专门函数的字典来提出一个函数工厂 或多或少类似于函数式编程风格 我尝试在下面的代码中执行此操作 require hash names c aa bb cc funs hash for i in seq length names
  • PHP 中 ::(双冒号)和 ->(箭头)有什么区别?

    PHP 中有两种不同的方法来访问方法 但是有什么区别呢 response gt setParameter foo bar and sfConfig set foo bar 我假设 gt 带有大于号或 V 形的破折号 用于变量函数 并且 双冒
  • 将 this 传递给函数的基本查询

    我正在尝试更好地理解 JavaScript function foo console log this normal function call foo this will refer to window 当我尝试将其传递给函数时 它会抛出
  • 如何判断这个内存泄漏是从哪里来的呢?

    如何确定代码中的内存泄漏来自何处 除了我的应用程序中的 main 函数之外 它没有引用任何内容 看来您正在尝试同时使用 NSZombieEnabled 和泄漏 这两种诊断技术不能一起工作 NSZombieEnabled 使所有已释放的对象都
  • 我应该如何在 Perl 中序列化代码引用?

    我希望nstore一个 Perl 哈希值 其中还包含代码引用 按照此perldoc http perldoc perl org Storable html CODE REFERENCEShttp perldoc perl org Stora
  • 为什么二叉搜索树中的查找时间复杂度为 O(log(n))?

    我可以看到 当在 a 中查找值时 如何BST每次将节点与我们要查找的值进行比较时 我们都会留下一半的树 但是我不明白为什么时间复杂度是O log n 所以 我的问题是 如果我们有一个包含 N 个元素的树 为什么查找树并检查特定值是否存在的时
  • 从 PHP 文本中提取 URL

    我有这样的文字 string this is my friend s website http example com I think it is coll 如何将链接提取到另一个变量中 我知道应该特别使用正则表达式preg match 但
  • .NET System.IO.BinaryWriter 写入的原始字节是否可以被其他平台读取?

    背景 我正在手动将大数据块写入二进制文件System IO BinaryWriter 我之所以选择这种方法 是因为与各种其他序列化和反序列化方法相比 它的性能得到了提高 我目前正在使用System IO BinaryReader Quest
  • 如何在 VS Code 中调试 vue js 应用程序?

    我使用创建了新的 vue js 应用程序vue init webpack my test3 在 VS Code v1 7 1 中 我尝试调试此应用程序和默认值launch json程序设置为 configurations type node
  • 如何处理nginx反向代理https到http方案重定向

    我已经将 nginx 设置为托管 jenkins 和其他一些应用程序的 ubuntu 实例上的反向代理 我使用 nginx 根据相对路径路由到各种应用程序 从客户端到 nginx 的所有流量都通过 https 进行 在防火墙后面 nginx
  • 在lisp中如何定义这样的常量?

    在Python中可以做到这一点 EMPTY PAWN KNIGHT BISHOP ROOK QUEEN KING BPAWN range 8 你会如何在 lisp 中做等价的事情 在 Lisp 中 只使用符号会更惯用 通常作为自评估关键字符
  • C# 中的方差规则

    The 方差有效性的精确规则 http blogs msdn com b ericlippert archive 2009 12 03 exact rules for variance validity aspx有点模糊而且不具体 我将列出
  • 扩展第一个容器以输出额外的 div 属性

    我开始将 pelican 与 reStructuredText 一起使用rst页面格式 我有自定义 javascript jQuery 的东西 我想用 div 属性来控制 比如data default tpl basename 具有嵌套内容
  • 上传文件并验证文件扩展名和文件大小 MVC 5

    我使用下面的代码来上传并检查文件扩展名和文件大小 Update 2控制器 public ActionResult Create Bind Include anak ID Pubdate kind title file details lin
  • 具有静态和响应宽度的两列模板

    有时我们需要结合百分比和固定值来计算尺寸 特别是在创建一些响应式布局时 就我而言 我只发现两种方法可以在纯 CSS 中实现所需的效果 Problem 让我们快速看一下这个问题 我们需要创建一个拉伸到页面整个宽度的两列布局 其中一列具有恒定的
  • Javascript:保留窗口对象引用?

    我的 javascript 代码打开一些窗口槽 var win window open 我将 win 引用与所有其他打开的窗口一起存储在一个数组中 一切正常 直到开启器刷新为止 所以我想要实现的是在加载 主 窗口时取回对打开的窗口的所有引用
  • 如何将 future 移至 lambda 表达式

    我正在使用 Visual Studio 2013 我想实现这行代码 f p get future auto task f std move f use f 我知道解决方案here https stackoverflow com questi