標頭檔案: 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 boost庫中sleep方法詳解
原型 cpp view plain copy print?void sleep timeduration const rel time void sleep system time const abs time 例項 cpp view plain copy print?boost this thre...
Boost boost庫中timer定時器 1
部落格 自 同步timer asio中提供的timer名為deadline timer,它提供了超時計時的功能。首先以乙個最簡單的同步timer為例來演示如何使用它。include include intmain 首先常見了乙個io service物件,它提供了io排程功能,asio庫中的所有io操...
Boost boost庫的隨機數的例子
void test mt19937 void test rand48 uniform smallint 在小整數域內的均勻分布 uniform int 在整數域上的均勻分布 uniform 01 在區間 0,1 上的實數連續均勻分布 uniform real 在區間 min,max 上的實數連續均勻...