boost庫在工作(13)繫結器與函式物件之一

2021-06-16 14:49:09 字數 986 閱讀 9568

在stl模板庫里提供兩個繫結器:bind1st和bind2nd,這兩個繫結器只支援兩個引數,如果是兩個以上的引數,就無能為力了。下面先來看看這兩個繫結器的使用例子,如下:

//#include "stdafx.h"

#include #include #include void fun(int x, int y)

//使用bind1st

void testcase1(void)

int _tmain(int argc, _tchar* argv)

執行這個例子,結果輸出如下:

std::bind1st(std::ptr_fun(fun), 10)(1)

fun:9

std::bind2nd(std::ptr_fun(fun), 10)(1)

fun:-9

請按任意鍵繼續. . .

在例子裡,這行**:

std::bind1st(std::ptr_fun(fun), 10)(1);

std::bind1st是繫結器;std::ptr_fun是獲取函式的指標,並轉換為合適的指標給繫結器使用;10是需要繫結的引數;1是傳送給繫結後的函式的引數。因為函式void fun(int x, int y)有兩個引數,經過繫結器std::bind1st繫結第乙個引數後,轉換出來的函式物件只需要輸入乙個引數就可以了。由此可見,繫結器可以把兩個引數的函式指標轉換為只有乙個引數的函式物件。std::bind1st和std::bind2nd的區別是選擇繫結兩個引數的那乙個引數上。從上面的例子可以看到,使用std::bind1st是繫結到第乙個引數,函式的呼叫就相當於fun(10,1),所以(x-y)運算結果是9。而std::bind2nd是繫結到第二個引數,函式的呼叫相當於fun(1,10),所以(x-y)運算結果是-9。

細心的同學或許發現乙個特性,std::bind1st和std::bind2nd傳入的引數是一樣的大小和順序,但傳送給fun函式會不一樣,這樣特性就叫做引數重排,利用這個特性可以讓同樣小於判斷的函式,同樣可以用於大於的判斷上。

boost庫在工作(15)繫結器與函式物件之三

前面已經可以優美地解決兩個引數的函式給演算法for each呼叫了,但是又會遇到這樣的一種情況,當需要三個引數或者三個以上的引數給演算法for each呼叫呢?從stl裡的繫結器bind1st,顯然是不行了,因為它最多隻支援兩個引數,那還有什麼辦法呢?這時就需要使用boost庫里強大的繫結器bind...

boost庫在工作(19)執行緒之四

從前面也看到使用鎖boost mutex時,如果不小心就會死鎖,這樣要費心費力去維護這樣的 在boost庫里提供同乙個函式遞迴呼叫時使用的鎖boost recursive mutex,當同乙個執行緒呼叫時,碰到相同已經上鎖的鎖時,還可以繼續往下執行。這時就不用擔心同乙個執行緒呼叫不同的函式時造成死鎖...

boost庫在工作(20)執行緒之五

通過上面的學習,基本上就可以使用執行緒了,但怎麼樣讓執行緒執行類裡的成員函式呢?以便封裝得更方便使用了。接著下來,就看這個例子,如下 include stdafx.h include include include 封裝執行緒組執行的類,並且演示使用類成員函式作為執行緒組執行函式 class cth...