прекомпиляция — как заставить прекомпилятор C ++ выполнять «цикл»;

Я хочу упростить следующий код:

switch (index)
{
case 1:
output = function1();
break;
case 2:
output = function2();
break;
case 3:
output = function3();
break;
....

куда index постоянная времени компиляции

Если бы я использовал макрос прекомпилятора, мне нужно было бы использовать его n раз, где n это количество случаев. Как я могу уменьшить вышеупомянутый код до O (1) строк кода?

0

Решение

Может быть, супермакро может немного упростить вашу работу.
Просто создайте файл «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

Другие решения

Попробуйте это (предполагая, что функции 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();}

Если это не постоянная времени компиляции, вам нужно сгенерировать переключатель, как предлагает Фомин Арсений. Другой вариант будет использовать массив указателей на функции

3

Вы не можете сделать это с помощью макроса — но это будет работать (я думаю):

int (*functions[])() = { &function1, &function2, &function3};

int output = functions[index]();
3
По вопросам рекламы [email protected]