1. 程式人生 > >[C++] 使用 typedef 簡化函式指標定義

[C++] 使用 typedef 簡化函式指標定義

函式型別由返回型別和引數列表決定,與函式名無關:

// pf 指向一個返回bool,且有兩個const string& 型別引數的函式,*pf 必須用括號括起來,否則會變成函式宣告
bool (*pf)(const string &, const string &);

由於函式指標型別容易變得笨拙,因此用 typedef 關鍵字簡化定義,使函式指標易於使用:

typedef bool (*cmpFcn)(const string &, const string &);

cmpFcn 為一個函式指標型別的名稱。

函式名可當成指標,函式引數型別可以是可以是函式(會被自動當成函式指標)或者函式指標。函式可以返回函式指標型別,但不能返回函式型別。

// ff 為函式名,引數為 int,返回型別為 int (*)(int*, int) 的函式指標,讀函式指標的最佳方法是從內到外。
int (*ff(int))(int*, int);

一段code:

class SUITEK_CTest;
class SUITEK_CTestClassInfo;
typedef SUITEK_CTest* (*pmTestFactory)();
typedef void (*pmTestParams)( SUITEK_CTestClassInfo* pHead );

class SUITEK_CTestClassInfo
{
public:
   SUITEK_CTestClassInfo( pmTestFactory pmFactory,        //ptr to (static) method which ctors a test
                          pmTestParams pmParams,          //ptr to (static) method which builds parameter list
                          const char * pName,             //test class name
                          const char * pVersion,          //version string
                          short wClassAttributes = 0 );   //test class attributes: see attrFlags above
   virtual ~SUITEK_CTestClassInfo();
   void SetDescription (const char * strDescription);
   const char * GetDescription() const;
   const char * GetName() const;
   void DestroyTest( SUITEK_CTest *& pTest );
   SUITEK_CTest * CreateTest();

   //....
   typedef std::map<std::string, SUITEK_Parameter> TestParameterInfo;
   const TestParameterInfo * GetParametersInfo() const;
private:
   std::string mName;
   std::string mVersion;
   std::string mDescription;
   pmTestFactory mFactory;
   pmTestParams mParams;
   TestParameterInfo mTestParamInfo;
   std::map<unsigned long, SUITEK_CTest*> mTstObjRef;
};

SUITEK_CTestClassInfo::SUITEK_CTestClassInfo( pmTestFactory pmFactory, pmTestParams pmParams,
                                              const char * pName, const char * pVersion, short wClassAttributes ) :
   mName(pName),
   mVersion(pVersion),
   mDescription(""),
   mFactory(pmFactory),
   mParams(pmParams)
{
   mParams(this);   // Call CreateParams
   SUITEK_Registry::GetInstance()->RegisterTest(this);
}
《C++ Primer 7.9》