【发布时间】:2013-11-25 19:11:07
【问题描述】:
我有一组硬件处理程序类,它们都派生自一个基类,它们必须响应传入的数据包。该数据包的一部分是一个 ASCII 字符串,它决定了硬件处理程序的哪个成员函数用于处理数据包(例如“fan”将执行ToggleFan() 函数。
class HardwareHandler {
virtual void dispatchCommand(const String& cmd) = 0;
}
class FooblerHandler : public HardwareHandler {
void toogleFan();
void dispatchCommand(const String& cmd) {
//is this a "good" way to do this?
if (cmd == "fan")
toggleFan();
}
}
我使用 JUCE 作为框架,这意味着我有模板化的 HashMaps 和 String。
但是,我在想出一种基于此字符串选择正确处理函数的简洁方法时遇到了麻烦。构造
if (str == "hello")
FooCommand();
else if (str == "bar")
BarCommand();
在概念上对我来说看起来很丑,因为那里有很多相对昂贵的字符串比较。但是,代码很容易编写,并且每个类的逻辑都保存在一个地方。
我尝试过的另一种选择是将字符串的哈希映射到枚举并使用 switch 语句:
switch (str.getHash())
{
case CmdFoo:
FooCommnad();
break;
....and so on
}
不过,这也需要我设置一个静态哈希映射,并保持开关匹配。
我尝试的其他方法是从字符串到成员函数指针本身的哈希映射,希望能够直接从字符串跳转到成员函数,而无需在 case 语句中列出它们,并且还允许非常通用调度函数,因为它只需要在哈希映射中查找,它甚至不需要知道所有选项 - 它们可以单独包含在哈希映射中,允许我将调度函数推送到基处理程序类,而不是在每个特定的设备处理程序中重复自己。但是,这种方法让我很困惑,因为我无法完全弄清楚如何正确地做到这一点,或者即使可以使用静态哈希映射和成员函数来做到这一点。
是否有一种惯用的方法来基于字符串(或类似的难以比较的类型)向成员函数分派,最好是尽可能多地使用能够被泛化并移动到父类的逻辑?
【问题讨论】:
-
std::map<std::string, std::function<...> >怎么样? -
所有方法都返回
void吗? -
不,他们在现实生活中返回
bool。
标签: c++ hashmap function-pointers dispatch member-function-pointers