我必须将一个成员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;
}
};
由于
答案 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, " "));