ホームページ  >  記事  >  バックエンド開発  >  C でパックされた可変個引数テンプレート引数リストを反復処理する方法

C でパックされた可変個引数テンプレート引数リストを反復処理する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-23 18:09:02474ブラウズ

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

パックされた可変個引数テンプレート引数リストの反復

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 ステートメントが必要な場合は、回避策を実装できます:

  • Try/Throw の使用: 例外をスローしてループをエスケープします。 注: この方法では、関数の速度が大幅に低下する可能性があります。
  • 変数/If スイッチ: 各タイプを表す変数によって制御される switch ステートメントを使用します。これは理想的ではありませんが、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。