Функция членства класса как обратный вызов с помощью повышения:: свяжите и повысьте:: функция

Я работаю посредством установки функции членства как обратный вызов для C-библиотеки, которую я использую. C-библиотека настраивает обратные вызовы как это:

typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);

setCallback(param1, param2, functionPointer, param4)

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

Class A {
 public: 
  A();
 protected:
  int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}

Может это быть сделанным с помощью повышения:: свяжите и повысьте:: функция? На то, Как я могу передать функцию членства класса как обратный вызов? (3-й ответ) кажется, что я мог объявить следующее (где-нибудь, или как определение типа):

boost::function myCallbackFunction

И затем где-нибудь в (ctor) называют повышение:: привяжите тот тип и передайте его в вызов C-библиотеки.

Действительно ли это возможно, или является мной от основы? Большое спасибо.

7
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Нет. Типы фанкторов типа boost::function не преобразуются в указатели функций для использования с механизмами обратного вызова C.

Однако, большинство механизмов обратного вызова C имеют какой-то токеновый механизм, так что ваша функция обратного вызова (которая является статической) имеет некоторую контекстную информацию. Вы можете использовать это для написания оберточного класса, который сопоставляет эти маркеры с объектами functor, и передает выполнение в правильном направлении:

class CallbackManager {
public:
    typedef boost::function<int (type1*, type2*, type3*)> callback;

    static void setCallback(CallbackManager::callback cb)
    {
        void *token = ::setCallback(staticCallback);
        callbacks[token] = callback_I;
    }

    static void staticCallback(void* token, type1* a, type2* b, type3* c)
    { return mcallbacks[token](a, b, c); }

private:
    static std::map<void*, callback > callbacks;
};
5
ответ дан 7 December 2019 в 10:02
поделиться

Проблема с функций-членов заключается в том, что они автоматически получают указатель на экземпляр объекта в качестве первого параметра - указатель "this". Поэтому нельзя использовать функции-члены обратного вызова C. Чтобы использовать функцию-член, необходимо иметь вместе объект и указатель на функцию.

.
0
ответ дан 7 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: