【问题标题】:How does the UnaryFunction look like in std::for_each在 std::for_each 中 UnaryFunction 的外观如何
【发布时间】:2018-07-09 23:34:20
【问题描述】:

我在玩std::for_each,我可以理解以下内容:

std::vector<int> nums{1,2,3,4,5,6};
std::for_each(nums.begin(), nums.end(), [](int& n) {
  n++;
});

根据定义,UnaryFunction f 不难扣除。

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);

但是,当我有一个线程向量时

std::vector<std::thread> threads;

我对这行阻止并等待执行完成的特定代码行着迷:

std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join))

它是如何工作的?在这种情况下,UnaryFunction 是什么? std::thread::join 不带参数,因此它不是一元函数。 std::mem_fn 有什么魔力来创建一元函数?

【问题讨论】:

    标签: c++ std


    【解决方案1】:

    std::thread::join 确实实际上采用了一个参数 - 它是 std::thread * 类型的隐藏(隐含)this 参数。对于任何非静态成员函数也是如此:它实际上比显式声明的参数多一个。 std::mem_fn “取消隐藏”隐含的 this 参数,将其变为可见参数。

    所以,std::mem_fn(&amp;std::thread::join) 确实是一个具有std::thread * 类型参数的一元函数。生成的函数对象实现标准的INVOKE 行为,这意味着它也可以使用std::thread &amp; 参数调用。

    【讨论】:

      【解决方案2】:

      基本上 - 相当于这样:

      std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); })
      

      所以std::mem_fun(&lt;ref to member function&gt;) 生成一个函子,该函子接受对该类型实例的引用,并在使用该实例调用时调用被引用的成员函数。

      【讨论】:

      • std::mem_fn 在 C++17 中不被弃用。也许你的意思是deprecated overloads
      • 问题中没有使用std::mem_fun
      • @MárioFeroldi mem_fn 需要在原问题中调用 join 成员函数。
      • @WhatABeautifulWorld 是的,它不是std::mem_fun(正如@Nim 所说;我认为这是一个错字),因为它不存在。它是std::mem_fn。并且std::mem_fn 未被弃用。
      • @MárioFeroldi 哦哦哦。是的,这不好玩:)
      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2020-09-08
      • 2010-09-18
      相关资源
      最近更新 更多