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 を 2 回呼び出そうとすると、ID とユーザーデータが異なると、2 回目の呼び出しが拒否されます。
そのため、新しい ID ハンドラーを追加するたびにラムダを作成できるのではないかと考えました。
auto msgHandler = [](xmpp_conn_t* const pConn,
xmpp_stanza_t* const pStanza,
void* const pUserdata) -> int
しかし、ラムダのポインター値を見たとき
printf("%p\n", (void*)((xmpp_handler)msgHandler));
2回実行したところ、両方とも同じ値が得られました。この場合、ラムダは静的関数のようです。
では、新しい ID をリッスンするたびに、新しい一意の関数ポインターを作成するにはどうすればよいでしょうか? あるいは、libstrophe の使用方法を誤解していますか? リッスンする新しい ID ごとに新しい静的関数を用意する必要がありますか?