可変引数テンプレート関数で Dectype を使用するトレーリング戻り型
さまざまな型の引数を合計して戻り値を返す変分テンプレート関数を作成しようとする場合
問題の定式化
後続の戻り値の型として decltype を使用する基本的な実装では、引数が 2 つを超えると未定義の動作が発生します。これを回避するには、関数を明示的に宣言できますが、これにより複数の引数の型推論が正しく行われなくなります。
カスタム特性クラスを使用した解決策
これらの問題を解決するには、次のようにします。 sum_type と呼ばれるカスタム特性クラスが利用されます。 std::add_rvalue_reference と std::val を使用して戻り値の型を再帰的に計算します。
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
template <class T, class... P> auto sum(const T& t, const P&... p) -> typename sum_type<T,P...>::type { return t + sum(p...); }
改良された型推定
さらに、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(a (b c)) と一致し、予想される加算順序と一致することが保証されます。
以上が可変引数テンプレート関数で後続の戻り値の型を使用して、さまざまな型の引数を合計する関数の正しい戻り値の型を推定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。