ホームページ > バックエンド開発 > C++ > C で可変引数テンプレート引数の関数を呼び出す方法

C で可変引数テンプレート引数の関数を呼び出す方法

Patricia Arquette
リリース: 2024-11-24 16:31:14
オリジナル
352 人が閲覧しました

How to Call Functions on Variadic Template Arguments in C  ?

可変引数テンプレート引数での関数の呼び出し

目標は、可変数の引数を受け取り、各引数に対する任意の関数。これは、引数の型ごとに個別の特殊化を行う再帰的実装のコンパクトな代替手段として望まれます。

C 17 ソリューション

C 17 では、これは、フォールド式:

(f(args), ...);
ログイン後にコピー

この式は、args 内の引数を展開し、それぞれに対して f() を呼び出します。 f() がオーバーロードされたカンマ演算子を含むオブジェクトを返す場合は、次を使用します。

((void)f(args), ...);
ログイン後にコピー

C 17 より前の解決策

C 17 より前のバージョンの C の場合、一般的なアプローチは、リスト初期化子を使用して引数を展開することです。

{ print(Args)... }
ログイン後にコピー

ただし、print() void を返すため、コンパイル エラーを避けるために、コードを次のように変更できます。

using expand_type = int[];
expand_type{ (print(Args), 0)... };
ログイン後にコピー

これは可変個引数に対して機能しますが、考慮すべき注意点がいくつかあります。このパターンを再利用可能にするには、マクロを作成します:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
ログイン後にコピー

ただし、オーバーロードされたカンマ演算子による潜在的な問題を防ぐために、マクロを次のように更新できます:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
ログイン後にコピー

Pre -C 17 ソリューションでは、不必要なメモリ割り当てを避けるために追加の考慮事項が必要になる場合もあります。

以上がC で可変引数テンプレート引数の関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート