bind - boost
標頭檔案: boost/bind.hpp
bind 是一組過載的函式模板.
用來向乙個函式(或函式物件)繫結某些引數.
bind的返回值是乙個函式物件.
它的原始檔太長了. 看不下去. 這裡只記下它的用法:
9.1 對於普通函式
假如有函式 fun() 如下:
void fun(int x, int y)
現在我們看看怎麼用 bind 向其繫結引數.
對於像 fun 這樣的普通函式. 若fun 有n個引數. 則 bind 需要 n+1 個引數: 原始函式的位址 以及 n個要繫結的引數.
第 1種用法:
向原始函式 fun 繫結所有的引數
boost::bind(&fun, 3, 4) // bind的實參表依次為: 要繫結的函式的位址, 繫結到fun的第乙個引數值, 第二個引數值...
// fun有多少個引數, 這裡就要提供多少個.
表示將 3 和 4 作為引數繫結到 fun 函式.
因為繫結了所有的引數. 現在我們呼叫bind所返回的函式物件:
boost::bind(&fun, 3, 4)( ); //無引數.
就會輸出 3, 4
第 2種用法:
向原始函式 fun 繫結一部分引數
boost::bind(&fun, 3, _1) // bind的實參表依次還是: 要繫結的函式的位址, 要繫結到fun的第乙個引數值, 然後注意
// 因為我們不打算向fun繫結第2個引數(即我們希望在呼叫返回的functor時再指定這個引數的值)
// 所以這裡使用 _1 來佔位. 這裡的 _1 代表該新函式物件被呼叫時. 實參表的第1個引數.
// 同理下邊還會用到 _2 _3 這樣的佔位符.
這裡只為fun繫結了第乙個引數3. 所以在呼叫bind返回的函式物件時. 需要:
boost::bind(&fun, 3, _1)(4); //這個4 會代替 _1 佔位符.
輸出 3, 4
同理 boost::bind(&fun, _1, 3)(4);
輸出 4, 3
第 3種用法:
不向 fun 繫結任何引數
boost::bind(&fun, _1, _2) // _1 _2 都是佔位符. 上邊已經說過了.
所以它就是 將新函式物件在呼叫時的實參表的第1個引數和第2個引數 繫結到fun函式.
boost::bind(&fun, _1, _2)(3, 4); // 3將代替_1佔位符, 4將代替_2佔位符.
輸出 3, 4
同理 boost::bind(&fun, _2, _1)(3, 4); // 3將代替_1佔位符, 4將代替_2佔位符.
會輸出 4, 3
同理 boost::bind(&fun, _1, _1)(3); // 3將代替_1佔位符
會輸出 3, 3
對於普通函式就這些. 對於函式物件. 如:
struct func
} f;
繫結的時候可能要指出返回值的型別:
boost::bind(f, 3)(); //指出返回值的型別 void
9.2 對於非靜態成員函式
假如有:
struct a
};a a;
a* pa = new a; //指標
boost::shared_ptrptr_a(pa); //智慧型指標.
現在要向像 a::func 這樣的非靜態成員函式繫結.
若a::func有n個引數, 則 bind 要有 n+2 個引數: 指向成員函式fun的指標, 繫結到this的物件, n個引數.
如:
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個引數是 物件. 物件指標. 還是智慧型指標. bind函式都能夠正常工作.
9.3 bind巢狀
有個類如下. 記錄人的資訊:
class personal_info ;
vectorvec;
...現在要對 vec 排序. 可以用 bind 函式做乙個比較謂詞
std::sort(
vec.begin(),
vec.end(),
boost::bind(
std::less(),
boost::bind(&personal_info::age,_1), //_1 佔位符是 sort 中呼叫比較函式時的第乙個引數.
boost::bind(&personal_info::age,_2))); //_2 佔位符是 sort 中呼叫比較函式時的第二個引數.
9.4 函式組合
假如有:
vectorints;
...想用 std::count_if() 來求ints中有多少是 >5 且 <=10 的. 這在常規**中通常就要寫乙個函式來實現這個謂詞:
if (i>5 && i<=10) ...
現在用 bind則可以:
std::count_if(
ints.begin(), ints.end(),
boost::bind(
std::logical_and(),
boost::bind(std::greater(),_1,5),
boost::bind(std::less_equal(),_1,10)));
9.5 繫結到成員變數
有:mapmy_map;
my_map[0]="boost";my_map[1]="bind";
現在要輸出所有元素的 second 成員. 也就是輸出這些字串. 其中的列印函式如下:
void print_string(const string& s)
則可以:
for_each(
my_map.begin(),
my_map.end(),
boost::bind(
&print_string,
boost::bind(&std::map::value_type::second,_1)));
boost bind的使用方法
此文 bind boost 標頭檔案 boost bind.hpp bind 是一組過載的函式模板.用來向乙個函式 或函式物件 繫結某些引數.bind的返回值是乙個函式物件.它的原始檔太長了.看不下去.這裡只記下它的用法 9.1 對於普通函式 假如有函式 fun 如下 void fun int x,...
boost bind的使用方法
bind boost 標頭檔案 boost bind.hpp bind 是一組過載的函式模板.用來向乙個函式 或函式物件 繫結某些引數.bind的返回值是乙個函式物件.它的原始檔太長了.看不下去.這裡只記下它的用法 9.1 對於普通函式 假如有函式 fun 如下 void fun int x,int...
boost bind的使用方法
標頭檔案 boost bind.hpp bind 是一組過載的函式模板.用來向乙個函式 或函式物件 繫結某些引數.bind的返回值是乙個函式物件.它的原始檔太長了.看不下去.這裡只記下它的用法 9.1 對於普通函式 假如有函式 fun 如下 void fun int x,int y 現在我們看看怎麼...