public:
Status(const std::string &name) : name_(name), ok_(true){}
void BreakIt()
{
ok_ = false;
}
bool IsBroken() const
{
return ok_;
}
void Report() const
{
std::cout 《 name_ 《 is 《 (ok_ ok : broken) 《 std::endl;
}
private:
std::string name_;
bool ok_;
};
int main()
{
std::vector<STATUS> v_status;
v_status.push_back(Status(status 1));
v_status.push_back(Status(status 2));
v_status.push_back(Status(status 3));
v_status.push_back(Status(status 4));
v_status .BreakIt();
v_status .BreakIt();
std::cout 《 use or: 《 std::endl;
for (std::vector<STATUS>::iterator it = v_status.begin(); it < v_status.end(); it++)
{
it->Report();
}
std::cout 《
use or_each, mem_fun_ref: 《 std::endl;
std::for_each(v_status.begin(), v_status.end(), std::mem_fun_ref(&Status::Report));
std::cout 《
use or_each, bind: 《 std::endl;
//std::for_each(v_status.begin(), v_status.end(), boost::bind(&Status::Report)); //error
std::for_each(v_status.begin(), v_status.end(), boost::bind(&Status::Report, _1));
}</STATUS></STATUS></BOOST></ALGORITHM></VECTOR></STRING></IOSTREAM>
总结:
bind成员函数最大的不同是,必须指明调用该函数的实例对象,代码中用"_1"表示。
翻译:调用成员函数(2)
下面,我们稍微改造一下vector容器,让它装入指针而不是值:
std::vector<STATUS*> p_statuses;
p_statuses.push_back(new status(status 1));
p_statuses.push_back(new status(status 2));
p_statuses.push_back(new status(status 3));
p_statuses.push_back(new status(status 4));
p_statuses ->break_it();
p_statuses ->break_it();</STATUS*>
我们仍然可以用两种标准库,但是我们不能用mem_fun_ref,而是用mem_fun适配器,虽然它的名字听起来有点儿混淆,完成操作还是没问题的。
std::for_each(
p_statuses.begin(),
p_statuses.end(),
std::mem_fun(&status::report));
注意到,这段代码的语法已经有所改变,尽管我们要做的工作几乎相同。当然,如果代码的语法和上面的例子一样就最好了,这样我们就可以更多地关注代码到底做了些什么而不是它怎么做的。使用Bind,我们不需要显式指明要处理的元素是指针(这在容器类型中已经说明了,重复的信息在现代的库里面显然是不必要的)
std::for_each(
p_statuses.begin(),
p_statuses.end(),
boost::bind(&status::report,_1));
如你所见,这与之前非指针元素的代码没有任何区别。也就是说如果你理解了刚才的bind,那么这个也能理解。
#include <IOSTREAM>
#include <STRING>
#include <VECTOR>
#include
#include <BOOST bind.hpp="">
class Status
{
public:
Status(const std::string &name) : name_(name), ok_(true){}
void BreakIt()
{
ok_ = false;
}
bool IsBroken() const
{
return ok_;
}
void Report() const
{
std::cout 《 name_ 《 is 《 (ok_ ok : broken) 《 std::endl;
}
private:
std::string name_;
bool ok_;
};
int main()
{
std::vector<STATUS*> v_pstatus;
v_pstatus.push_back(new Status(status 1));
v_pstatus.push_back(new Status(status 2));
v_pstatus.push_back(new Status(status 3));
v_pstatus.push_back(new Status(status 4));
v_pstatus ->BreakIt();
v_pstatus ->BreakIt();
std::cout 《 use or: 《 std::endl;
for (std::vector<STATUS*>::iterator it = v_pstatus.begin(); it < v_pstatus.end(); it++)
{
(*it)->Report();
}
std::cout 《
use or_each, mem_fun_ref: 《 std::endl;
std::for_each(v_pstatus.begin(), v_pstatus.end(), std::mem_fun(&Status::Report));
std::cout 《
use or_each, bind: 《 std::endl;
std::for_each(v_pstatus.begin(), v_pstatus.end(), boost::bind(&Status::Report, _1));
}</STATUS*></STATUS*></BOOST></ALGORITHM></VECTOR></STRING></IOSTREAM>