boost库:函数对象

Posted sssblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost库:函数对象相关的知识,希望对你有一定的参考价值。

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

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库:函数对象的主要内容,如果未能解决你的问题,请参考以下文章

boost库 线程使用

详解Boost库智能指针(shared_ptr && scoped_ptr && weak_ptr )

Boost:在单独的加载/保存函数中非侵入性地序列化一个类

Boost Python - 用参数包装构造函数

常用Javascript代码片段集锦

所有的 Boost 库文档的索引