我有以下方法:
CalculateThreshold(std::vector<double> &data, int thres)
{
// include functionality
}
然后我有一个向量的向量,我想使用std::for_each
进行迭代,我尝试使用以下内容:
std::for_each(
std::begin(results),
std::end(results),
std::bind2nd(std::mem_fun(&CalculateThres), 1));
但我不断收到错误消息:
注意:候选人是模板std :: mem_fun_t&lt; _Ret,_Tp&gt; std :: mem_fun(_Ret(_Tp :: *)())
有人建议我哪里出错了吗?对我来说,这应该有效!
答案 0 :(得分:7)
只需使用std::bind
,就不需要std::mem_fun
(如评论中所述)。
std::for_each(
std::begin(results),
std::end(results),
std::bind(CalculateThres, std::placeholders::_1, 1));
答案 1 :(得分:6)
让我们更仔细地看一下编译器所说的内容,特别是那部分:
std::mem_fun_t<_Ret, _Tp> std::mem_fun(_Ret (_Tp::*)())
_Ret (_Tp::*)()
表示指向成员函数的指针。您试图传递自由函数CalculateThreshold
,因此这不起作用,类型不匹配。
此外,在C ++ 11中不推荐使用std::mem_fun
和std::bind2nd
。
你正在使用C ++ 11,所以你基本上有三个简单的解决方案:
使用for range loop:
for (auto && v : results)
CalculateThreshold(v, 1);
std::foreach(std::begin(results), std::end(results),
std::bind(CalculateThreshold, std::placeholders::_1, 1));
使用带std::foreach
的lambda:
std::foreach(std::begin(results), std::end(results),
[](std::vector<double> & data) { CalculateThreshold(data, 1); });