C では、多くの場合、可変個引数のテンプレート引数を反復処理して、呼び出しなどの特定の操作を実行することが望ましいです。関数。これは、
(f(args), ...);
のいずれかを使用して実現できます。ただし、呼び出された関数がオーバーロードされたカンマ演算子を含むオブジェクトを返す可能性がある場合は、
((void)f(args), ...);C 17 より前の解決策一般的なアプローチは、リストの初期化を利用し、その中で展開を実行することです。
{ print(Args)... }print() は void を返すため、次のようにすることができます。 int を返すことで問題を回避します:
{ (print(Args), 0)... }これが任意の数の引数で確実に機能するようにするには、パックに常に少なくとも 1 つの要素を持たせることができます:
{ 0, (print(Args), 0)... }カプセル化できますこのパターンを再利用可能なマクロに変換します:
namespace so { using expand_type = int[]; } #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)... }不必要なメモリ割り当てが心配な場合は、次のように定義できます。リストの初期化をサポートしますが、データは保存しないカスタム型:
以上がC ですべての可変個引数テンプレート引数に対して関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。