UnaryFunction如何在std :: for_each中看起来像

时间:2018-01-30 23:52:59

标签: c++ std

我正在玩 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 有什么神奇的功能来创建一元函数?

2 个答案:

答案 0 :(得分:1)

基本上 - 它等同于:

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

因此std::mem_fun(<ref to member function>)生成一个函子,它接受对该类型实例的引用,并在使用该实例调用时,调用引用的成员函数。

答案 1 :(得分:1)

std::thread::join 实际上是一个参数 - 它是this类型的隐藏(隐含)std::thread *参数。对于任何非静态成员函数都是如此:它实际上还有一个参数而不是显式声明。 std::mem_fn&#34;取消隐藏&#34;隐含的this参数,将其转换为可见参数。

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