C ++ STL for_each应该使用一个参数获取指向成员函数的指针

时间:2009-11-05 07:17:23

标签: c++ stl

我必须将一个成员fn的地址传递给std :: for_each。我该怎么做?

class A{

void load()
{
vector<int> vt(10,20);
std::for_each(vt.begin(), vt.end(), &A::print); 
//It didnt work when i tried mem_fun1(&A::print)
}

void print(int a)
{
cout<<a;
}

};

由于

3 个答案:

答案 0 :(得分:4)

vt中的内容是整数,而不是A类型的对象。此外,print不会操纵任何成员变量,只需将其设为static

class A{

void load()
{
vector<int> vt(10,20);
std::for_each(vt.begin(), vt.end(), A::print); // static functions are regular functions
}

static void print(int a)
{
cout<<a;
}

};

答案 1 :(得分:4)

使用std :: mem_fun时,必须将指针作为第一个参数传递给class。在这种情况下,您可以使用std :: bind1st绑定它。

class A
{
public:
    void print(int v) {std::cout << v;}

    void load()
    {   
        std::vector<int> vt(10, 20);

        std::for_each(vt.begin(), vt.end(), std::bind1st(std::mem_fun(&A::print), this));
    }
}

答案 2 :(得分:3)

我发现boost :: bind很有帮助。这样我就不必记住与std :: mem_fun相关的所有规则。

#include <boost/bind.hpp>
class A{

void load()
{
  vector<int> vt(10,20);
  std::for_each(vt.begin(), vt.end(), boost::bind(&A::print,this,_1)); 
}

void print(int a)
{
  cout<<a;
}   
};

虽然在这种特殊情况下,我希望将副本改为ostream_iterator成语:

copy(vt.begin(), vt.end(), ostream_iterator<int>(cout, " "));