可能重复:
Using bind1st for a method that takes argument by reference
我有以下传统的C ++ 03循环(仅使用auto
进行堆栈溢出空间效率):
for (auto it = some_vector.begin(); it != some_vector.end(); ++it)
{
foobar.method(*it);
}
在C ++ 11中,我设法将其重写为以下for_each
调用,该调用非常有效:
std::for_each(some_vector.begin(), some_vector.end(),
std::bind(&Foobar::method, std::ref(foobar), _1));
(当然我可以在C ++ 11中使用lambda,但这不是重点。)不幸的是,std::bind
不是C ++ 03的一部分,所以我试着用{{1来模拟它}和std::bind1st
:
std::mem_fun_ref
但是这在Visual Studio中触发了C2535错误(“已定义或声明的成员函数”):
std::for_each(some_vector.begin(), some_vector.end(),
std::bind1st(std::mem_fun_ref(&Foobar::method), std::ref(foobar)));
这是Visual Studio中的const-correctness错误,还是我做错了什么?
此外,// inside class binder1st in header xfunctional
result_type operator()(const argument_type& _Right) const
{ // apply functor to operands
return (op(value, _Right));
}
result_type operator()(argument_type& _Right) const
{ // apply functor to operands <--- ERROR C2535 HERE
return (op(value, _Right));
}
似乎不是C ++ 03的一部分。有没有解决方法?
答案 0 :(得分:3)
为什么不简单地使用std::mem_fun
?它期望指针作为第一个参数,如下:
#include <functional>
#include <algorithm>
#include <vector>
struct foo{
void method(int){}
};
int main(){
std::vector<int> v;
foo f;
std::for_each(v.begin(), v.end(),
std::bind1st(std::mem_fun(&foo::method), &f));
}