У меня есть проблема classi c использования библиотеки C, которая использует обратные вызовы функций.
Я прочитал много статей, но они требовали более высокого уровня знаний, чем у меня, чтобы следуйте предложениям. Я достаточно ясно понял проблему - отсутствие ссылки на объект. Однако между boost, std :: function, std :: bind, typedefs и шаблонами было много фрагментов, но у меня не было единого целого изображения. Было ясно, что некоторые методы не применяются, поскольку они требуют изменения вызывающей функции библиотеки, и это не вариант для меня, по крайней мере, в краткосрочной перспективе (библиотека с открытым исходным кодом).
Это были лучшие статьи, которые я нашел:
Первая статья была довольно полной, но примеры все еще были абстрактными. Вторая статья на самом деле помогла демистифицировать эту топи c с помощью более конкретного примера. Решение, которое я реализовал по приведенной ниже ссылке, может быть слишком сложным, но: (1) оно было наилучшим образом задокументировано, и (2) после его изучения я убедился, что могу адаптировать его к своему коду. В нижней части статьи автор предоставил ссылку на их пример кода, который я смог скомпилировать, запустить и затем адаптировать.
После адаптации к моей библиотеке я теперь получаю ошибки компилятора, которые мне не удалось устранить.
‘MemberFunctionCallback::MemberFunctionCallback(const MemberFunctionCallback&)’
is private within this context
: handler(m), std::function<T>(h) {}
^
Пример исходного кода длинный (вы можете увидеть по ссылке) и не видите, как уменьшить его до минимального кода или как отделить его от моей библиотеки. Посмотрев на проблему и прочитав ее, я подозреваю, что моя проблема связана со сложным списком аргументов обратного вызова моей библиотеки Статья, которую я прочитал выше, имеет очень короткий список аргументов (два целых). Список аргументов моей функции обратного вызова:
callback_fn(const char *osc_addrPattern, const char *osc_typeTags, lo_arg ** argv, int argc)
В любом случае, я подозреваю, что этот блок ниже является неправильным, в частности, правильный список аргументов для StaticInvoke .
template <int context> class DynamicHandlerCallback : public HandlerCallbackBase
{
public:
DynamicHandlerCallback()
: HandlerCallbackBase(&DynamicHandlerCallback<context>::GeneratedStaticFunction)
{
}
private:
static int GeneratedStaticFunction(const char *osc_addrPattern, const char *osc_typeTags, lo_arg ** argv, int argc)
{
return StaticInvoke(context, osc_addrPattern, osc_typeTags, argv, argc); // <= here
}
};
- Можно ли использовать мой список аргументов с решением, представленным в статье? Если да, то каков синтаксис?
- Вдоль этих строк, как бы вы передали такой список аргументов классу шаблона? (Я также не смог найти ответ на этот вопрос онлайн)
- Я неправильно подхожу к этому? Вы бы предложили другой подход?
Код, на который я ссылался выше, можно увидеть на предоставленной мной веб-странице (последняя ссылка). Я буду рад загрузить полный вывод компилятора.
Спасибо.