我正在使用C libstrophe 库在 C++11 中制作 xmpp 应用程序。我正在尝试为特定 ID 注册消息处理程序,因此我可以使用xmpp_id_handler_add识别特定的返回消息。
void xmpp_id_handler_add(xmpp_conn_t * const conn,
xmpp_handler handler,
const char * const id,
void * const userdata)
但是我不明白 strophe 的实现。
Strophe 将只接受形式的函数指针
typedef int (*xmpp_handler)(xmpp_conn_t * const conn,
xmpp_stanza_t * const stanza,
void * const userdata);
使用静态函数很容易做到这一点,但是通过查看源代码我发现了这一点
/* check if handler is already in the list */
item = (xmpp_handlist_t *)hash_get(conn->id_handlers, id);
while (item) {
if (item->handler == (void *)handler)
break;
item = item->next;
}
if (item) return;
这意味着如果我尝试使用相同的静态函数调用 xmpp_id_handler_add 两次,但 id 和 userdata 不同,它将拒绝第二次调用。
所以我想也许每次我想添加一个新的 ID 处理程序时我都可以制作一个 lambda,就像这样
auto msgHandler = [](xmpp_conn_t* const pConn,
xmpp_stanza_t* const pStanza,
void* const pUserdata) -> int
但是当我查看 lambda 的指针值时
printf("%p\n", (void*)((xmpp_handler)msgHandler));
并运行了两次,两次都得到了相同的值。在这种情况下,lambda 似乎就像一个静态函数。
那么,每次我想监听一个新的 ID 时,如何创建一个新的、唯一的函数指针呢?或者,我是否误解了应该如何使用 libstrophe?您是否应该为每个要收听的新 ID 设置一个新的静态函数?