【Boost】boost库中bind的用法
頭文件: boost/bind.hpp
bind?是一組重載的函數(shù)模板.
用來向一個(gè)函數(shù)(或函數(shù)對(duì)象)綁定某些參數(shù).?
bind的返回值是一個(gè)函數(shù)對(duì)象.
它的源文件太長了. 看不下去. 這里只記下它的用法:
9.1 對(duì)于普通函數(shù)
假如有函數(shù) fun() 如下:?
?void fun(int x, int y)?{
??cout << x << ", " << y << endl;
?}
現(xiàn)在我們看看怎么用 bind 向其綁定參數(shù).?
對(duì)于像 fun 這樣的普通函數(shù). 若fun 有n個(gè)參數(shù). 則 bind 需要 n+1 個(gè)參數(shù): 原始函數(shù)的地址 以及 n個(gè)要綁定的參數(shù).
第 1種用法:?
向原始函數(shù) fun 綁定所有的參數(shù)
?boost::bind(&fun, 3, 4)???? // bind的實(shí)參表依次為: 要綁定的函數(shù)的地址, 綁定到fun的第一個(gè)參數(shù)值, 第二個(gè)參數(shù)值...
????????// fun有多少個(gè)參數(shù), 這里就要提供多少個(gè).
表示將 3 和 4 作為參數(shù)綁定到 fun 函數(shù).?
因?yàn)榻壎怂械膮?shù). 現(xiàn)在我們調(diào)用bind所返回的函數(shù)對(duì)象:
?boost::bind(&fun, 3, 4)( );? //無參數(shù).?
就會(huì)輸出 3, 4
第 2種用法:?
向原始函數(shù) fun 綁定一部分參數(shù)
?boost::bind(&fun, 3, _1)??? // bind的實(shí)參表依次還是: 要綁定的函數(shù)的地址, 要綁定到fun的第一個(gè)參數(shù)值, 然后注意
????????// 因?yàn)槲覀儾淮蛩阆騠un綁定第2個(gè)參數(shù)(即我們希望在調(diào)用返回的Functor時(shí)再指定這個(gè)參數(shù)的值)
????????// 所以這里使用 _1 來占位. 這里的 _1 代表該新函數(shù)對(duì)象被調(diào)用時(shí). 實(shí)參表的第1個(gè)參數(shù).
????????// 同理下邊還會(huì)用到 _2 _3 這樣的占位符.?
這里只為fun綁定了第一個(gè)參數(shù)3. 所以在調(diào)用bind返回的函數(shù)對(duì)象時(shí). 需要:
?boost::bind(&fun, 3, _1)(4);? //這個(gè)4 會(huì)代替 _1 占位符.
輸出 3, 4
同理 boost::bind(&fun, _1, 3)(4);?
輸出 4, 3
第 3種用法:
不向 fun 綁定任何參數(shù)
?boost::bind(&fun, _1, _2)?? // _1 _2 都是占位符. 上邊已經(jīng)說過了.
所以它就是 將新函數(shù)對(duì)象在調(diào)用時(shí)的實(shí)參表的第1個(gè)參數(shù)和第2個(gè)參數(shù) 綁定到fun函數(shù).??
?boost::bind(&fun, _1, _2)(3, 4);??? // 3將代替_1占位符, 4將代替_2占位符.
輸出 3, 4
同理 boost::bind(&fun, _2, _1)(3, 4);?? // 3將代替_1占位符, 4將代替_2占位符.
會(huì)輸出 4, 3??
同理 boost::bind(&fun, _1, _1)(3); ??? // 3將代替_1占位符
會(huì)輸出 3, 3
對(duì)于普通函數(shù)就這些.?對(duì)于函數(shù)對(duì)象. 如:
?struct Func {
??void operator()(int x) {
???cout << x << endl;
??}
?} f;
綁定的時(shí)候可能要指出返回值的類型:
?boost::bind<void>(f, 3)();? //指出返回值的類型 void
?
9.2 對(duì)于非靜態(tài)成員函數(shù)
假如有:
?struct A {
??void func(int x, int y)?{
???cout << x << "," << y << endl;
??}
?};
?
?A a;??
?A* pa = new A;?//指針
?boost::shared_ptr<A> ptr_a(pa);? //智能指針.
?
現(xiàn)在要向像 A::func 這樣的非靜態(tài)成員函數(shù)綁定.?
若A::func有n個(gè)參數(shù), 則 bind 要有 n+2 個(gè)參數(shù): 指向成員函數(shù)fun的指針, 綁定到this的對(duì)象, n個(gè)參數(shù).
如:??
?boost::bind(&A::func,?a, 3, 4)();??? //輸出 3, 4
?boost::bind(&A::func,?pa, 3, 4)();?? //輸出 3, 4
?boost::bind(&A::func,?ptr_a, 3, 4)();//輸出 3, 4
同樣可以用 _1 這樣的占位符. 如:
?boost::bind(&A::func, _1, 3, 4)(ptr_a);//輸出 3, 4
可以看出. 不論傳遞給bind 的第2個(gè)參數(shù)是 對(duì)象. 對(duì)象指針. 還是智能指針. bind函數(shù)都能夠正常工作.
9.3 bind嵌套
有個(gè)類如下. 記錄人的信息:
?class Personal_info {
??string name_;
??int age_;
?public:
??int get_age();
??string name();
?};
?vector<Personal_info> vec;?
?...
現(xiàn)在要對(duì) vec 排序. 可以用 bind 函數(shù)做一個(gè)比較謂詞
?std::sort(??
??vec.begin(),??
??vec.end(),??
??boost::bind(?
???std::less<int>(),????
???boost::bind(&personal_info::age,_1),???? //_1 占位符是 sort 中調(diào)用比較函數(shù)時(shí)的第一個(gè)參數(shù).
???boost::bind(&personal_info::age,_2)));?? //_2 占位符是 sort 中調(diào)用比較函數(shù)時(shí)的第二個(gè)參數(shù).
9.4 函數(shù)組合
假如有:
?vector<int> ints;
?...
想用 std::count_if() 來求ints中有多少是 >5 且 <=10 的. 這在常規(guī)代碼中通常就要寫一個(gè)函數(shù)來實(shí)現(xiàn)這個(gè)謂詞:
?if (i>5 && i<=10) ...
現(xiàn)在用 bind則可以:
?std::count_if(??
??ints.begin(),? ints.end(),??
??boost::bind(????
???std::logical_and<bool>(),????
???boost::bind(std::greater<int>(),_1,5),????
???boost::bind(std::less_equal<int>(),_1,10)));
?
9.5 綁定到成員變量
有:
?map<int, string> my_map;
?my_map[0]="Boost";my_map[1]="Bind";
現(xiàn)在要輸出所有元素的 second 成員. 也就是輸出這些字符串. 其中的打印函數(shù)如下:
?void print_string(const string& s) {??
??std::cout << s << '\n';
?}
則可以:
?for_each(??
??my_map.begin(),??
??my_map.end(),??
??boost::bind(
???&print_string,?
???boost::bind(&std::map<int,std::string>::value_type::second,_1)
???)
??);
總結(jié)
以上是生活随笔為你收集整理的【Boost】boost库中bind的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库中functi
- 下一篇: 【Boost】以boost::funct