我有一个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>);
答案 0 :(得分:2)
您设计中的刺是不同的参数类型。
如果将参数抽象为结构,则可以将函数简化为一个固定签名。
通过使用基础结构,签名更通用:
struct Arguments_Base
{
};
void SetRate(Arguments_Base& ab);
void EnableLogging(Arguments_Base& ab);
void SetAddress(Arguments_Base& ab);
通过统一签名,可以在表格或地图中使用函数指针或函数对象,从而使搜索更容易。搜索引擎应该是通用的,并且取决于数据的大小,以便只需要更改数据(例如表),而不是搜索引擎。
每种类型的参数都应该来自Arguments_Base
类。然后该函数可以dynamic_cast
基类引用。
参见:工厂设计模式,访客设计模式,双重调度