Использование метода SNMP ++ с обратным вызовом в файле .mm - PullRequest
0 голосов
/ 11 сентября 2018

Я использую библиотеку SNMP ++ в своем проекте, и все работает нормально.Тем не менее, есть метод, в котором мне нужно получить обратный вызов в моем файле .mm.Теперь, когда я создаю блок и передаю его этой функции в качестве параметра, он выдает ошибку «Нет подходящей функции-члена для вызова get_bulk».Вот фрагмент кода:

    void(^callbackFunc)(int,Snmp*,Pdu&,SnmpTarget&,void*);
callbackFunc = ^(int i,Snmp* s,Pdu& p,SnmpTarget& t,void* v) {

};
snmp.get_bulk(pdu, *target, l_repeaters, l_repetitions,callbackFunc);

Кроме того, вот сигнатура функции для функции "get_bulk":

int Snmp::get_bulk(Pdu &pdu,                 // pdu to use
               const SnmpTarget &target, // destination target
               const int non_repeaters,  // number of non repeaters
               const int max_reps,       // maximum number of repetitions
               const snmp_callback callback,// callback to use
               const void * callback_data)  // callback data
{
  pdu.set_type( sNMP_PDU_GETBULK_ASYNC);
  return snmp_engine( pdu, non_repeaters, max_reps, target,
                  callback, callback_data);
}

Что я должен передать в типе "обратного вызова"?
Это typedef для SNMP_callback:

typedef void (*snmp_callback)(int reason, Snmp *session,
                           Pdu &pdu, SnmpTarget &target, void *data);

Я застрял в этом последние 4-5 часов и не могу понять, как решить эту проблему.

1 Ответ

0 голосов
/ 20 сентября 2018

Блоки Apple не могут быть преобразованы в указатели функций, поскольку они также содержат данные (захваченные переменные и т. Д.) И механизм подсчета ссылок.Вам нужно будет передать в качестве обратного вызова свободную функцию, статическую функцию-член класса C ++ или лямбду без захвата C ++.

Лямбда является синтаксически наиболее близкой к блоку;однако только не захватывающие лямбда-выражения могут быть преобразованы в указатель на функцию, поэтому вам потребуется выполнить захват «вручную», передав указатель на структуру контекста или аналогичную через аргумент void* callback_data, который предположительно передается в обратный вызовкак void* data.

Лямбда будет выглядеть примерно так:

snmp_callback callback =
    [](int reason, Snmp *session, Pdu &pdu, SnmpTarget &target, void *data)
    {
        // context_struct_type* context = static_cast<context_struct_type*>(data);
    };
...