【发布时间】:2019-03-05 14:26:12
【问题描述】:
我想用更优雅的东西代替大开关。
class Base
{
public:
Base(void*data, int size);
virtual void Something() = 0;
}
class A : public Base
{
public:
A(void*data, int size) : Base(data, size) {}
void Something() override;
}
class B : public Base
{
public:
B(void*data, int size) : Base(data, size) {}
void Something() override;
}
...
{
char c = input;
switch (c)
{
case 'a':
{
A obj(data, size);
obj.Something();
break;
}
case 'b':
{
B obj(data, size);
obj.Something();
break;
}
...
}
}
正如您在示例类中看到的那样,A 和 B 与外部没有区别。
我想找到一种方法来消除仅实例化正确类并在其上调用相同方法的开关,在我的真实代码中,该开关超过 1000 行长,并且有更多的类,但我找不到任何方法摆脱它。
在实际代码中,我有 2 个枚举而不是 char,还有更多开关,但我希望问题很清楚。
我的一个想法是在基类上使用模板,但我没有找到一种方法来实例化正确的子类而不需要那个巨大的开关。
编辑
我从网络接收数据包并想解析它并处理它。这些类a, b, ... 没有任何私有或公共成员,基类只有指向日期的原始指针和指向响应套接字的共享指针(也来自构造函数)。
我希望编译器使用 templates? 或其他一些机制为我生成该开关,以删除重复的源代码。目前它仍处于测试阶段,但它每秒处理大约 1000 个数据包,所以我不想在堆上分配和释放时移除开关并失去性能。
【问题讨论】:
-
或许看看工厂设计模式?
-
你忘记了
break之间的情况 -
是的,我删除了中断,因为它说我的代码太多而其他文本太少:(