Динамический массив функций

Решил для развлечения быстро накатать подобие консольного Exel со своим блэкджеком и алкоголем. Хотел реализовать прикол, что ты сам свои функции обработки пишешь и понял, что хз как это сделать. Была идея сделать типо тако-го

void (*func[3])(); //Статически работает

void (*(*functions))() = new (*void())[amountOfFunctions]; //Динамически не работает

Но понял что это не сильно работает.

Кто знает, можно ли такое реализовать без include-ов? Если да, то как это работает? (Ну и как выглядит)


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

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

Если я правильно понял задачу

#include <iostream>

void f1() { std::cout << "do f1\n"; }
void f2() { std::cout << "do f2\n"; }
void f3() { std::cout << "do f3\n"; }

using func_t = void (*)();
using func_p = func_t*;

int main()
{
    const int amountOfFunctions = 3;

    std::cout << "static\n";
    //void (*functions_1[amountOfFunctions])() = { f1, f2, f3 };
    func_t functions_1[] = { f1, f2, f3 };
    for (size_t i = 0; i < amountOfFunctions; ++i) {
        functions_1[i]();
    }

    std::cout << "\ndynamic\n";
    //func_t* functions_2 = new func_t[amountOfFunctions]{f1, f2, f3};
    auto functions_2 = new func_t[amountOfFunctions]{ f1, f2, f3 };
    for (size_t i = 0; i < amountOfFunctions; ++i) {
        functions_2[i]();
    }
    delete[] functions_2;

    std::cout << "\n\n   press [Enter]...";
    std::cin.get();
}

В общем, using + auto Вам в помощь. Но, к сожалению, это навряд ли поможет в контексте

сам свои функции обработки пишешь

→ Ссылка
Автор решения: Harry

Просто дополняя ответ Halturin Evgeniy — можно и без using + auto. Например:

std::cout << "\ndynamic\n";
void(**functions_2)() = new (void(*[amountOfFunctions])()){ f1, f2, f3 };
for (size_t i = 0; i < amountOfFunctions; ++i) {

Вот, все компилируется и работает: https://ideone.com/MyMBPh

→ Ссылка
Автор решения: user7860670

Если уже есть объявленные прототипы нужныхъ функций, то вместо дополнительных объявлений и фокусов со скобочками брать тип от прототипов посредством decltype:

#include <vector>

void f1() { ... }
void f2() { ... }

int main()
{
    ::std::vector<decltype(&f1)> funcs{};
    funcs.emplace_back(&f1);
    funcs.emplace_back(&f2);
}
→ Ссылка