将SNMP ++方法与.mm文件中的回调配合使用

时间:2018-09-11 11:21:01

标签: ios function-pointers objective-c-blocks snmp objective-c++

我在项目中使用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);
}

我应该在“回调”类型中传递什么?
这是SNMP_callback的类型定义:

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

在过去的4-5个小时中,我一直在坚持这一点,我不知道该如何解决。

1 个答案:

答案 0 :(得分:0)

Apple的块不能转换为函数指针,因为它们还包含数据(捕获的变量等)和引用计数机制。您将需要传递一个自由函数,静态C ++类成员函数或一个C ++非捕获lambda作为回调。

lambda在语法上最接近块;但是,只有非捕获的lambda可以转换为函数指针,因此,您需要通过void* callback_data参数传递一个指向上下文结构或类似结构的指针来“手工”进行捕获,这大概是通过传递给回调为void* data

lambda看起来像这样:

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