可変個引数テンプレートを使用して、アトミック マルチキャスト ライブラリ (isis2.codeplex.com) である Isis2 の静的型情報をキャプチャしています。一部の Isis2 イベントはアップコール経由で配信されます。たとえば、コーディングする場合
Group g("myGroup");
g.Handlers[UDPATE] += [](string& name, Foo& f) { ... your code };
....
g.OrderedSend(UPDATE, "John Doe", new Foo(...));
次に、グループ g で文字列と Foo オブジェクトを含む更新を含むマルチキャストを受信すると、Isis2 は Foo オブジェクトのローカル インスタンスを構築し、適切な引数を使用してこのラムダをアップコールします。
これが私のパズルです。OrderedSend への引数をスキャンするための可変長コードがあり、メッセージの作成に必要な静的型情報を取得できます。最終的に、実際の OrderedSend メソッドに引数の 1 次元配列を渡します。それぞれの引数の型、ポインター、またはデータまたはオブジェクトへの安全な参照、およびオブジェクトの場合はマーシャリング メソッドのアドレスが含まれます。しかし、可変個引数テンプレートを使用してラムダをスキャンするには、ハンドラのベクトルに追加されるオブジェクトがラムダであるという意味で、関数の「内部引数リスト」を調べる必要があります。type_traits メソッドは、タイプ「関数」のオブジェクトです。ラムダの引数リストから、string 型と Foo 型を探しています。しかし、私が見る限り、type_traits.h には引数リストにアクセスするためのものが何もありません。
GCC-11 固有のオプションは、typeid をアンマングルし、結果の文字列を解析することです。しかし、コンパイル時にラムダの引数リストにアクセスできるようにする可変個引数テンプレート機能はありますか?