Перебор функций в c++

реализую систему управления манипулятором на сервоприводах и есть некоторое количество точек траектории движения манипулятора, который управляется сервоприводами, описал траекторию точек через набор функций, и вот вопрос как реализовать перебор этих функций в зависимости от пришедшего задания. Возможно ли избежать использование конструкций if-else или switch-case?


Ответы (1 шт):

Автор решения: KoVadim

Это классическая задача, которая сводится к тому, что все функции, которые Вы хотите "перебирать", должны иметь одинаковую сигнатуру и все это потом помещается в std::map. Вот где то так

#include <iostream>
#include <map>

void foo1(int a) {
    std::cout << "foo1(" << a << ")\n";
}

void foo2(int a) {
    std::cout << "foo2(" << a << ")\n";
}

void foo3(int a) {
    std::cout << "foo3(" << a << ")\n";
}

using func_t = void(*)(int a);

int main()
{
    std::map<std::string, func_t> m = {
        {"1", foo1},
        {"2", foo2},
        {"3", foo3},
    };

    m["2"](5);
    return 0;
}

Что делать, если сигнатуры разные? тут проблема, но можно просто добавит все нужные параметры и просто не использовать. Или завести 2-3 мапы для разных типов.

В примере выше используется строковый ключ для поиска фукнции, если ключ просто число или перечисление (enum), то вполне можно использовать и массив/вектор.

→ Ссылка