パックされた可変個引数テンプレート引数リストの反復
C では、パックされた可変個引数テンプレート引数リストを反復処理すると、次のような特有の課題が生じます。コンパイル時のリフレクション機能。ただし、このタスクに取り組むことができるテクニックがあります。
問題を理解する
目標は、テンプレート引数のパックを反復処理し、特定の引数のデータを抽出することです。型 (int、char*、float など) を抽出し、それを別のベクトルに格納します。さらに、引数が出現した順序を追跡するにはベクトルが必要です。
解決策へのアプローチ
Lambda での折り畳み式の使用:
混合型入力の場合、C 17 フォールド式をラムダ式と一緒に使用できます。ラムダはループ動作をカプセル化し、カウンターをインクリメントし、各入力の値とその位置を出力します。
<code class="cpp">template<class ... Ts> void Foo(Ts && ... inputs) { int i = 0; ([&]() { ++i; std::cout << "input " << i << " = " << inputs << std::endl; }(), ...); }
Return/Break ステートメントの処理:
If return またはループ内で Break ステートメントが必要な場合は、回避策を実装できます:
カスタム マクロのアプローチ:
別のアプローチには、型を構築するカスタム マクロの作成が含まれます。すべての引数を保持し、それをベクトル内で展開します。これは非標準メソッドですが、目的の機能を実現できます。
<code class="cpp">struct any { void do_i(int e) { INT = e; } void do_f(float e) { FLOAT = e; } void do_s(char* e) { STRING = e; } int INT; float FLOAT; char* STRING; }; #define def(name) \ template<typename... T> \ auto name(T... argv) -> any { \ std::initializer_list<any> argin = { argv... }; \ std::vector<any> args = argin; #define get(name, T) get<T>()(args[name]) #define end }</code>
このアプローチでは、arg() 関数を手動で呼び出して、引数ごとに任意のインスタンスを作成する必要があります。
結論
C でパックされた可変個引数テンプレート引数リストを反復処理するには、革新的なソリューションが必要です。ここで説明するアプローチはこの課題に対処し、移植性とクロスプラットフォーム互換性を維持しながら、混合型の引数を効率的に処理できるようにします。
以上がC でパックされた可変個引数テンプレート引数リストを反復処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。