[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》
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值