C++11新特性之七:bind和function
扫描二维码
随时随地手机看文章
一.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