函数对象是指那些可以被传入到其它函数或是从其它函数返回的一类函数.
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)));
- }
来源: http://www.bubuko.com/infodetail-2914074.html