Динамический массив функций
Решил для развлечения быстро накатать подобие консольного Exel со своим блэкджеком и алкоголем. Хотел реализовать прикол, что ты сам свои функции обработки пишешь и понял, что хз как это сделать. Была идея сделать типо тако-го
void (*func[3])(); //Статически работает
void (*(*functions))() = new (*void())[amountOfFunctions]; //Динамически не работает
Но понял что это не сильно работает.
Кто знает, можно ли такое реализовать без include-ов? Если да, то как это работает? (Ну и как выглядит)
Ответы (3 шт):
Если я правильно понял задачу
#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
Вам в помощь.
Но, к сожалению, это навряд ли поможет в контексте
сам свои функции обработки пишешь
Просто дополняя ответ 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
Если уже есть объявленные прототипы нужныхъ функций, то вместо дополнительных объявлений и фокусов со скобочками брать тип от прототипов посредством decltype
:
#include <vector>
void f1() { ... }
void f2() { ... }
int main()
{
::std::vector<decltype(&f1)> funcs{};
funcs.emplace_back(&f1);
funcs.emplace_back(&f2);
}