std function的本質和使用特性

2021-07-09 04:38:21 字數 2042 閱讀 2371

1.仿函式:又叫std::function,是c++中的乙個模板類

2.c語言中的函式指標:

int  add(int a,int b)

typedef int (*func)(int,int);//給函式型別定義別名

func func1;

func1=add;//給函式指標初始化

或者int (*func1)(int,int)=add;

函式指標的好處:

假設有10個函式:add,sub,mul,div,...如果採用普通的switch()  case:

switch(status)

//缺點,如果函式過多,假設有100個case,那麼呼叫某個case的效率會很低,因為case是從第乙個case逐一比較,知道匹配為止,因此必須盡量把呼叫概率高的case放在最前面,以減少匹配比較的次數

如果採用函式指標來實現:

typedef int (*pfunc)(int,int);

pfunc func[10]=;

func[status](2,3);//直接呼叫某個指定的函式,效率很高,而且每個函式的效率與訪問的概率和匹配比較的次數無關

總結:採用函式指標是動態繫結,而採用switch case哪種型別的是靜態繫結,即編譯時就決定了呼叫哪個函式,而不是等到執行時才決定

3.c++中把函式指標封裝成了乙個類,這也正是c++中無處不類的思想的體現,即std::function,還是個模板類

需要包含的標頭檔案:

#include

using namespace std;

std::functionfunc=add;//是例項化模板引數,表示返回值為int,函式引數為2個,(int,int),即int(*pfunc)(int ,int )型別的函式

int res=func(3,4);//仿函式呼叫

cout<4.仿函式在c++類成員函式中的使用便利之處

傳統的類成員函式指標的使用方法:

class test

}typedef int (*pfunc)(int ,int);//使用型別別名的成員函式指標

pfunc pfunc;

test::pfunc=test::add

5.傳統的成員函式指標的用法:

int( test::*pfunc)(int ,int)=&test::add; //類成員函式指標的定義

呼叫:(this->*)pfunc(3,4);//太複雜了

6.bind的功能:把乙個具體函式,變成std::function物件

void func(int a,char b,float c)

將bind與乙個普通函式繫結:

6.1可以改變引數的個數,實際上是在繫結時已經給了預設引數,

std::functionpfunc=std::bind(func,100,'c',2.5);//繫結

pfunc();//呼叫,此時可以不用傳任何引數,因為在繫結時,已經提供了引數

6.2改變引數的順序

std::functionpfunc=std::bind(func,std::placeholders::_3,std::placeholders::_2,std::placeholders::_1);

pfunc(5.5,'a',10);//呼叫時引數的順序改變了,變成了(float,char,int)

6.3也可以同時改變引數額個數和順序

std::functionpfunc=std::bind(func,100,std::placeholders::_2,std::placeholders::_1);//這裡的_2代表實參列表中的第二個引數'x',_1代表實參列表中的第乙個引數9.9,但是bind中引數的順序仍然要按照被呼叫函式的引數順序來,即(int,char,float)

pfunc(9.9,'x');//省略了int引數,且改變了float和char的順序

7.bind的設計思想;

高內聚,低耦合,使被呼叫的函式和呼叫者完全隔離開來.呼叫者可以根據需要任意設計介面,和傳參,而被呼叫函式通過bind可以不經修改介面就可以相容各種需求的變化.

區別於靜態繫結,動態繫結,這屬於程式設計師自動繫結.

std function 的效能陷進

std function 的作用很強大,他讓vector等儲存不同型別函式的物件 function,functor,lambda 成為了可能。但他有乙個潛在的效能風險 在儲存lambda bind時,如果物件的大小 大於兩個指標的大小,他就需要分配動態空間。這是大部分人寫c 的人不期望看到的。先看f...

和equals本質的區別

我們知道equals是object的方法,那我們先看看在object這個類中是如何定義的 public boolean equals object obj 顯然意見,在object類中的equls方法其實也是用 來判斷兩個物件是否相等。但是看下面這段 test public void testequ...

AOP的本質和意義

aop的本質和意義 該文首先對aop的概念進行了介紹。其次介紹了aop的動態特性。有兩個圖比較經典 下圖是物件導向的動態特性原理的乙個簡化模型。此處圖貼不上,如果需要可以聯絡我!下圖是aop的乙個特性原理圖。此處圖無法貼上,如果需要可以聯絡我!上面兩個圖比較形象生動的解釋了aop和oop之間的差異。...