Я хочу упростить следующий код:
switch (index)
{
case 1:
output = function1();
break;
case 2:
output = function2();
break;
case 3:
output = function3();
break;
....
куда index
постоянная времени компиляции
Если бы я использовал макрос прекомпилятора, мне нужно было бы использовать его n
раз, где n
это количество случаев. Как я могу уменьшить вышеупомянутый код до O (1) строк кода?
Может быть, супермакро может немного упростить вашу работу.
Просто создайте файл «counter.def» с кодом:
COUNTER(1)
COUNTER(2)
COUNTER(3)
#undef COUNTER
Тогда в любом случае использования выключателя или любой другой конструкции с повторным подсчетом
switch(index)
{
#define COUNTER(i) case i: output = function##i(); break;
#include "counter.def"}
Попробуйте это (предполагая, что функции 1-n являются реальными именами. И этот индекс, как вы говорите, является константой времени компиляции):
#define CALLFUNCTION(x) function##x()
output = CALLFUNCTION(1);
коррекция: это не будет работать для переменных, будет работать, если константа используется напрямую. Это может нанести ущерб цели, если предоставленный код — это все, что есть в каждом операторе case.
Нет необходимости делать переключение вообще. В качестве альтернативы вы можете использовать специализацию шаблонов.
template<int index> function();
output = function<index>();
и специализировать шаблон функции для каждого индекса.
template<> function<1>(){return 1;} // or {return function1();}
Если это не постоянная времени компиляции, вам нужно сгенерировать переключатель, как предлагает Фомин Арсений. Другой вариант будет использовать массив указателей на функции
Вы не можете сделать это с помощью макроса — но это будет работать (я думаю):
int (*functions[])() = { &function1, &function2, &function3};
int output = functions[index]();