函数类型由返回类型和参数列表决定,与函数名无关:
// 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》