当前位置:首页 > 芯闻号 > 充电吧
[导读]一.std::bindbind是这样一种机制,它可以将参数绑定于可调用对象,产生一个新的可调用实体,这种机制在函数回调时颇为有用。C++98中,有两个函数bind1st和bind2nd,它们分别用来绑

一.std::bind

bind是这样一种机制,它可以将参数绑定于可调用对象,产生一个新的可调用实体,这种机制在函数回调时颇为有用。C++98中,有两个函数bind1st和bind2nd,它们分别用来绑定functor的第一个和第二个参数,都只能绑定一个参数。C++98提供的这些特性已经由于C++11的到来而过时,由于各种限制,我们经常使用bind而非bind1st和bind2nd。在C++11标准库中,它们均在functional头文件中。而C++STL很大一部分由Boost库扩充,STL中的shared_ptr等智能指针,bind及function都是由Boost库引入。在写代码过程中,要养成使用bind,function,lambda和智能指针的习惯,它们非常强大简洁实用。

1.过时的bind1st和bind2nd
bind1st(op, arg) :op(arg, param) 
bind2nd(op, arg) :op(param, arg)

vectorcoll {1, 2, 3, 4, 5, 11, 22, 5, 12};
// 查找第一个元素值大于10的元素
std::find_if(coll.begin(), coll.end(), // 范围
             std::bind2nd(std::greater(), 10));// 将10绑定到第二个参数,也就是 ......大于10
// 查找元素值大于10的元素的个数
int _count = count_if(coll.begin(), coll.end(), // 范围
              std::bind1st(less(), 10));// 将10绑定到第一个参数,也就是10小于......

2. C++11中的std::bind


//function object内部调用plus<>(也就是operator+),以占位符(placeholders)_1为第一个参数,
//以10为第二个参数,占位符_1表示实际传入此表达式的第一实参,返回“实参+10”的结果值
auto plus10 = std::bind(std::plus(), std::placeholders::_1, 10);
std::cout << plus10(7) << std::endl;// 输出17
// (x + 10)*2,下面的代码中x=7
std::bind(std::multiplies(), 
          std::bind(std::plus(), std::placeholders::_1, 10),// i+10
          2)(7);

注意:上面所用的less

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭