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

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

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?

Trailing Return Type Using Dectype with a Variadic Template Function

When attempting to create a variational template function that sums arguments of varying types and returns an appropriately typed sum, common issues arise.

Problem Formulation

A basic implementation using decltype as the trailing return type results in undefined behavior for arguments exceeding two. To avoid this, the function can be declared explicitly, but this leads to incorrect type deduction for multiple arguments.

Solution Using Custom Traits Class

To overcome these issues, a custom traits class called sum_type is utilized. It recursively calculates the return type using std::add_rvalue_reference and 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... > {};
ログイン後にコピー

Modified Implementation

By replacing decltype with typename sum_type::type in the trailing return type, the function correctly deduces the result type for any number of arguments:

template <class T, class... P>
auto sum(const T& t, const P&amp;... p) -&gt; typename sum_type<T,P...>::type
{
   return t + sum(p...);
}
ログイン後にコピー

Improved Type Deduction

Additionally, a modification to the last specialization of sum_type provides improved type deduction:

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)&gt;{};
ログイン後にコピー

This ensures that the return type matches decltype(a+(b+c)), aligning with the expected addition order.

以上が可変引数テンプレート関数で後続の戻り値の型を使用して、さまざまな型の引数を合計する関数の正しい戻り値の型を推定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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