У меня есть API для управления конфигурацией камеры. Есть 344 отдельных варианта управления. Когда определенное значение изменяется, API вызывает функцию обратного вызова для уведомления программы. Функция регистра принимает указатель функции
void RegisterCallback(Option * ptr, void (fn*)(void*))
в качестве функции обратного вызова. Я не могу использовать одну функцию для обратного вызова, потому что теперь я делаю, откуда происходит обратный вызов .
Одно из решений - создать 344 отдельных функции обратного вызова:
void callback0(void*);
void callback1(void*);
...
void callback{n-1}(void*);
static void(*)(void*) callbacks[] = {callback0, callback1, ..., callback{n-1}};
Для этого решения мне нужно было бы сгенерировать заголовок с помощью отдельного инструмента / скрипта.
Другое решение - использовать препроцессор magi c (BoostPP), например
BOOST_PP_FOR((0,1024), PRED, OP, MYSTERIOUS_CALLBACK_MACRO);
По моему опыту, эти макросы не читаются разработчиками и их сложно поддерживать.
В идеале я мог бы использовать что-то вроде RegisterCallback(popt, [n](void*){/*n-th callback*/});
Но лямбда-функция - это функтор, а не указатель на функцию.
Мой вопрос такой: могу ли я создавать эти функции динамически? Или есть лучшее решение для этой проблемы, чем два выше?
Спасибо.
РЕДАКТИРОВАТЬ
Я получил ответ из Ботье. Передача объекта в функцию обратного вызова требует от вас доступа к коду на двоичном уровне (помимо C / C ++). Если Вы можете разрешить это, то решение может быть libffi, поскольку оно генерирует указатель c на каждый экземпляр Вашей функции. Он широко поддерживается, но, например, компилятор Visual Studio отсутствует в списке.
РЕДАКТИРОВАТЬ 2 Как отмечали другие, он должен работать и с VS.