Я хотел бы заменить большой выключатель на что-то более элегантное.
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, и есть больше переключателей, но я надеюсь, что проблема ясна.
Одной из моих идей было использование шаблонов в базовом классе, но я не нашел способа, как создать правильного потомка без этого огромного переключателя.
EDIT
Я получаю пакет из сети и хочу разобрать его и обработать. Эти классы a, b, ...
не имеют закрытых или открытых членов, базовый класс имеет только необработанный указатель на дату и общий указатель на сокет ответа (также из конструктора).
Я бы хотел, чтобы компилятор сгенерировал этот переключатель для меня с помощью шаблонов? или какого-либо другого механизма удаления этого повторяющегося исходного кода. Сейчас он все еще находится в стадии тестирования, но обрабатывает около 1000 пакетов в секунду, поэтому я не хочу удалять коммутатор и терять производительность при распределении и освобождении в куче.