将循环转移到C ++ 03 for_each

时间:2012-01-10 17:39:19

标签: c++ visual-studio-2010 stl foreach c++11

  

可能重复:
  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的一部分。有没有解决方法?

1 个答案:

答案 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));
}