Каждый вызываемый объект имеет одинаковый тип возвращаемого значения и одинаковое количество и тип параметров: например, скажем, все эти объекты можно вызывать как int func(void *). Однако они содержат различное количество (возможно, много) параметров (только фундаментального типа), привязанных к различным функциям для каждого вызываемого типа.
Вопрос в том, какой рекомендуемый C++ (C+) +23) способ реализации этого, избегая при этом динамического выделения памяти из-за необходимости хранения параметров связанной функции в вызываемом объекте?
Пример реализации с помощью std::function:
Код: Выделить всё
#include
#include
#include
int foo(int, void *);
int bar(char, double, void *);
int i; char c; double d;
auto callable_foo = std::function{[=](void *p){ return foo(i, p); } // binds i
auto callable_bar = std::function{[=](void *p){ return foo(c, d, p); } // binds c and d
using variant_t = std::variant;
std::array container{callable_foo, callable_bar};
После долгих поисков и экспериментов я нашел два многообещающих решения:
- использование std::variant для std:: привязки (например, auto callable_foo = std::bind(foo, i, _1); вместо этого)
- использование решения в стиле C с пользовательским типом данных для каждого вызываемого объекта, содержащим указатель на функцию и связанные параметры
- есть ли другие решения, кроме (1) и (2) избежать динамического выделения памяти?
- тип возвращаемого значения std::bind, похоже, не подлежит назначению (скопируйте и переместите, по крайней мере, в моем случае). Как поместить объекты, возвращаемые std::bind, в std::array, где каждый WrapperType имеет элемент данных типа decltype(std::bind(...))?
Моим любимым решением «я бы хотел» было использование шаблонной специализации std::function, позволяющей чтобы установить размер хранилища единого входа таким образом, чтобы все связанные параметры (размер, определенный во время компиляции) помещались в объект std::function.
Я искал в Google, спросил ChatGPT , прочитал несколько страниц cppreference, поэкспериментировал с реальным кодом, и спросил коллег.
Подробнее здесь: https://stackoverflow.com/questions/792 ... o-using-dy
Мобильная версия