1. 程式人生 > >用typedef定義函式指標的好處

用typedef定義函式指標的好處

typedef可以用於定義函式指標型別:

【語法】
typedef <返回型別> (*<函式型別名>)(引數表)
typedef <返回型別> (<類名>::*<函式型別名>)(引數表)

【用途】
1、可以用來定義該函式型別的函式指標,就不用每次使用函式指標都要寫一次函式原型了;
2、有了型別名,就可以使用在容器裡面,譬如map<int, 型別名>,用於實現靈活的函式呼叫。

【示例】

例1:
typedef void (*PF)(int x);

void func1(int x){ cout<<"func1:"<<x<<endl;}

void func2(int x){ cout<<"func2:"<<x<<endl;}

void main()
{
  PF pFunc;    //宣告一個函式指標只需要用PF型別名
  pFunc = func1;  //此處也可以使用pFunc = &func1;
  pFunc(38);
  pFunc = func2;
  pFunc(99);
}

-----------------------------------------------------------------------------------------------

例2:
class CUtil
{
public:
  CUtil();
  typedef void (CUtil::*pUFunc

)(int);  //定義原型為void CUtil::func(int)的函式指標的別名為pUFunc
  map<int, pUFunc> funcMap;     //可以用做map容器的元素型別
  void laner(int x);
  void execute();
};

CUtil::CUtil()
{
  funcMap[0] = &CUtil::laner;  //這裡初始化map容器,關聯數字0和函式laner
}

void CUtil::laner(int x)
{
  cout<<"laner:"<<x<<endl;
}

void CUtil::execute()
{
  (this->*funcMap[0])(38);   //呼叫map[0]關聯的函式
  //注意1:這裡必須使用this->,否則會有error C2171: “*”: “void (__thiscall CUtil::* )(int)”型別的操作  數非法的錯誤
  //注意2:這裡必須使用*解引用,才能實現函式呼叫,否則會有error C2064: 項不會計算為接受 1 個引數的函式的錯誤
}

void main()
{
  CUtil pUtil = new CUtil();
  pUtil->execute();
  (pUtil->*(pUtil->funcMap[0]))(38);  //與上一句等效,注意括號要用正確
}