如何通过函数指针调用具有不同签名的C ++函数

时间:2017-02-02 22:57:53

标签: c++ functor

我有一个C ++应用程序,其中main()实例化一个对象MyApp,然后将该对象传递给ReadConfig函数。

ReadConfig打开基于文本的文件,对其进行解析,并调用相应的MyApp方法进行配置。

01-JAN-01   P   0   HSIA_ADITIONAL_PROMO_IS0236 SAVE Promotional Offer  SAVE - $15 off IPBB for 12 mo (1.5 - 75M)   88464673    Telephone   ADD_PROMO   Y           HSIA    6145        Y   IS0236-STACKABLE - SAVE - $15 off IPBB for 12 mo (1.5 - 75M)

我正在努力维护ReadConfig,以便在将新的公共方法添加到MyApp时,它可以像更新表一样简单。我想出了以下解决方案,但我不喜欢它。由于必须确保我把0放在正确的位置,因此很难维护。

下面是我能够解决的一个例子。任何建议,使这更好​​,将不胜感激。注意我在嵌入式工作,所以我们使用的C ++编译器不支持C ++ 14&没有提升。我想避免使用任何STL库,以便了解自己这样做的机制。

这就是我所拥有的:

class MyApp
{
private:

public:
  void SetRate(uint16_t);
  void EnableLogging(bool);
  void SetAddress(uint32_t);
};

然后当我读取配置文件并解析它时,我调用一个函数来处理通过函数指针调用实际的MyApp函数。该功能如下:

enum ARGTYPE {TBOOL, TUINT16, TUINT32};

template<typename TOBJ, typename TARG>
struct TSetting
{
  void (TOBJ::*FSet)(TARG);
};

template<typename obj>
struct SETTINGFN
{
  const char                       *setting_name;
  ARGTYPE                          Targ;
  TSetting<obj,bool>               HBool;
  TSetting<obj,uint16_t>           HUint16;
  TSetting<obj,uint32_t>           HUint32;
};

SETTINGFN<MyApp> MyAppSettings[] =
{
  "logging"    ,TBOOL,       &MyApp::EnableLogging, 0,0,0
  ,"maxrate"   ,TUINT16,     0,0,0,&MyApp::SetRate
  ,"address"   ,TUINT32,     0, &MyApp::SetAddress, 0,0

};
unsigned int MyAppSettings_Count = sizeof(MyAppSettings) / sizeof(SETTINGFN<MyApp>);

1 个答案:

答案 0 :(得分:2)

您设计中的刺是不同的参数类型。

如果将参数抽象为结构,则可以将函数简化为一个固定签名。

通过使用基础结构,签名更通用:

struct Arguments_Base
{
};

void SetRate(Arguments_Base& ab);
void EnableLogging(Arguments_Base& ab);
void SetAddress(Arguments_Base& ab);

通过统一签名,可以在表格或地图中使用函数指针函数对象,从而使搜索更容易。搜索引擎应该是通用的,并且取决于数据的大小,以便只需要更改数据(例如表),而不是搜索引擎。

每种类型的参数都应该来自Arguments_Base类。然后该函数可以dynamic_cast基类引用。

参见:工厂设计模式,访客设计模式,双重调度