Home >Backend Development >C++ >How to Use `decltype` with a Variadic Template Function to Calculate the Sum of its Arguments?
Trailing Return Type Using decltype with a Variadic Template Function
When attempting to create a function that accumulates the sum of its arguments using a variadic template and trailing return type syntax, challenges arise. Specifically, the compiler may encounter errors for functions with more than two arguments. This is because the variadic function template is considered declared only after specifying its return type, resulting in a situation where sum in decltype cannot refer to the variadic function template itself.
A potential workaround involves using a custom traits class to avoid the recursive call within the decltype expression:
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... > {};
This allows for the replacement of decltype in the original program with typename sum_type
In order to ensure that the summation respects the order of operations (e.g., a (b c)), the final specialization of sum_type can be modified as follows:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
The above is the detailed content of How to Use `decltype` with a Variadic Template Function to Calculate the Sum of its Arguments?. For more information, please follow other related articles on the PHP Chinese website!