码迷,mamicode.com
首页 > 其他好文 > 详细

boost库:函数对象

时间:2019-01-09 15:46:23      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:begin   必须   需要   要求   for   code   看到了   iostream   它的   

函数对象是指那些可以被传入到其它函数或是从其它函数返回的一类函数。

1. boost::bind

bind提供了一个机制,是函数与几乎不限数量的参数一起使用,就可以得到指定签名的函数。bind会复制传递给它的参数。

#include <boost/bind.hpp>
#include <iostream>
#include <vector>
#include <algorithm>

void add(int i, int j) {
  std::cout << i + j << std::endl;
}

int main() {
  std::vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1));

  return 0;
}

add()函数要求两个参数,两个参数都必须传递给boost::bind()。第一个参数是10,第二个则是一个占位符,还有其他的占位符_2, _3。

使用这些占位符,boost::bind()可以变为一元、二元或三元的函数。对于_1,boost::bind()变成了一个一元函数,只需要一个参数的函数,而std::for_each()要求一个一元函数作为其第三个参数。程序执行,v中元素的值通过占位符_1传入到医院函数中,并进一步和常数一起传递到add()函数。通过这种机制,std::for_each()只看到了由boost::bind()定义的一元函数,而boost::bind()本身则是调用了另一个函数。

2. boost::ref

由于bind是复制传递给它的参数,如果参数为引用,则需要使用boost::ref(),boost::cref()

#include <boost/bind.hpp>
#include <iostream>
#include <vector>
#include <algorithm>

void add(int i, int j, std::ostream& os) {
  os << i + j << std::endl;
}

int main() {
  std::vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1, boost::ref(std::cout)));
}

 

boost库:函数对象

标签:begin   必须   需要   要求   for   code   看到了   iostream   它的   

原文地址:https://www.cnblogs.com/sssblog/p/10244539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!