использование списка сложных аргументов с шаблоном класса - PullRequest
1 голос
/ 08 февраля 2020

У меня есть проблема 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
    }
};
  • Можно ли использовать мой список аргументов с решением, представленным в статье? Если да, то каков синтаксис?
  • Вдоль этих строк, как бы вы передали такой список аргументов классу шаблона? (Я также не смог найти ответ на этот вопрос онлайн)
  • Я неправильно подхожу к этому? Вы бы предложили другой подход?

Код, на который я ссылался выше, можно увидеть на предоставленной мной веб-странице (последняя ссылка). Я буду рад загрузить полный вывод компилятора.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...