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
template <class T, class... P> auto sum(const T& t, const P&... p) -> 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>() )>{};
This ensures that the return type matches decltype(a+(b+c)), aligning with the expected addition order.
以上が可変引数テンプレート関数で後続の戻り値の型を使用して、さまざまな型の引数を合計する関数の正しい戻り値の型を推定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。