ホームページ > バックエンド開発 > C++ > 可変引数テンプレート関数で後続の戻り値の型を使用して、さまざまな型の引数を合計する関数の正しい戻り値の型を推定するにはどうすればよいでしょうか?

可変引数テンプレート関数で後続の戻り値の型を使用して、さまざまな型の引数を合計する関数の正しい戻り値の型を推定するにはどうすればよいでしょうか?

DDD
リリース: 2024-11-15 02:26:02
オリジナル
424 人が閲覧しました

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

可変引数テンプレート関数で 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::type を後続の戻り値の型に指定すると、関数は任意の数の引数の結果の型を正しく推定します:

template <class T, class... P>
auto sum(const T& t, const P&amp;... 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 サイトの他の関連記事を参照してください。

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