标签: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))); }
标签:begin 必须 需要 要求 for code 看到了 iostream 它的
原文地址:https://www.cnblogs.com/sssblog/p/10244539.html