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