C++中的仿函數,std::function和bind()的用法

1.仿函數:又叫std::function,是C++中的一個模板類程序員

2.C語言中的函數指針:函數

int  add(int a,int b)this

{spa

  return a+b;設計

}指針

typedef int (*func)(int,int);//給函數類型定義別名對象

func func1;接口

func1=add;//給函數指針初始化it

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

函數指針的好處:

假設有10個函數:add,sub,mul,div,...若是採用普通的switch()  case:

switch(status)

{

  case 0:add(2,3);break;

  case 1:sub(2,3);break;

  case 1:sub(2,3);break;

  case 1:sub(2,3);break;

  ...

}

//缺點,若是函數過多,假設有100個case,那麼調用某個case的效率會很低,由於case是從第一個case逐一比較,知道匹配爲止,所以必須儘可能把調用機率高的case放在最前面,以減小匹配比較的次數

若是採用函數指針來實現:

typedef int (*pFunc)(int,int);

pFunc func[10]={add,sub,mul,div,...};

func[status](2,3);//直接調用某個指定的函數,效率很高,並且每一個函數的效率與訪問的機率和匹配比較的次數無關

總結:採用函數指針是動態綁定,而採用switch case哪一種類型的是靜態綁定,即編譯時就決定了調用哪一個函數,而不是等到運行時才決定

3.C++中把函數指針封裝成了一個類,這也正是C++中無處不類的思想的體現,即std::function,仍是個模板類

須要包含的頭文件:

#include<functional>

using namespace std;

 std::function<int(int ,int)>func=add;//<int(int,int)>是實例化模板參數,表示返回值爲int,函數參數爲2個,(int,int),即int(*pfunc)(int ,int )類型的函數

int res=func(3,4);//仿函數調用

cout<<res<<endl;//res=7

4.仿函數在C++類成員函數中的使用便利之處

傳統的類成員函數指針的使用方法:

class test{

public:

  int add(int a,int b)

  {

    return a+b;

  }

}

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)

{

  cout<<"a="<<a<<"b="<<b<<"c="<<c<<endl;

}

將bind與一個普通函數綁定:

6.1能夠改變參數的個數,其實是在綁定時已經給了默認參數,

std::function<void()>pfunc=std::bind(func,100,'c',2.5);//綁定

pfunc();//調用,此時能夠不用傳任何參數,由於在綁定時,已經提供了參數

6.2改變參數的順序

std::function<void(float,char,int)>pfunc=std::bind(func,std::placeholders::_3,std::placeholders::_2,std::placeholders::_1);

pfunc(5.5,'a',10);//調用時參數的順序改變了,變成了(float,char,int)

6.3也能夠同時改變參數額個數和順序

std::function<void(float,char)>pfunc=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能夠不經修改接口就能夠兼容各類需求的變化.

區別於靜態綁定,動態綁定,這屬於程序員自動綁定.

相關文章
相關標籤/搜索