C では、多くの場合、可変個引数テンプレート引数を反復処理して、呼び出しなどの特定の操作を実行することが望ましいです。関数。これは、
(f(args), ...);
のいずれかを使用して実現できます。ただし、呼び出された関数がオブジェクトを返す可能性がある場合は、オーバーロードされたカンマ演算子を使用する場合は、次を使用する必要があります:
((void)f(args), ...);
一般的なアプローチは、リストの初期化を利用し、その中で展開を実行することです:
{ print(Args)... }
Because print() returns 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)... }
不必要なメモリ割り当てが心配な場合は、リストをサポートするカスタム型を定義できます。初期化しますが、データは保存しません:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3