可変長引数テンプレート関数で decltype を使用するトレーリング戻り型
可変長引数を使用して引数の合計を累積する関数を作成しようとする場合テンプレートと後続の戻り値の型の構文を使用すると、問題が発生します。具体的には、3 つ以上の引数を持つ関数に対してコンパイラでエラーが発生する可能性があります。これは、可変個引数関数テンプレートは戻り値の型を指定した後にのみ宣言されているとみなされ、decltype の sum が可変個引数関数テンプレート自体を参照できない状況が発生するためです。
潜在的な回避策としては、カスタム特性クラスを使用して、 decltype 式内の再帰呼び出しを回避します:
template<class T> typename std::add_rvalue_reference<T>::type val(); template<class T> struct id{typedef T type;}; template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
これにより、元のプログラムの decltype を typename sum_type
合計が演算の順序 (例: a (b c)) に従うことを保証するために、sum_type の最後の特殊化を次のように変更できます。
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
以上が可変引数テンプレート関数で `decltype` を使用して引数の合計を計算する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。