вывод типа в variadic templates
Есть рабочий код подсчёта суммы всех аргументов функции через variadic templates. Не могу понять какой возвратный тип используется "под" auto. Через fold expressions было бы удобнее, но очень хочется понять, можно ли задать вместо auto тип и если да, то какой?
#include <iostream>
auto func() {
return 0;
}
template<typename T, typename...A>
auto func(T s, A...args) {
return s + func(args...);
}
int main()
{
std::cout << func(4.9, 1.7, 11, 19.6, 23) << std::endl; // Вывод: 62.2
return 0;
}
P.S Уважаемый @Harry подсказал, что тип можно вывести посредством std::common_type. Немного подкорректировал. Можно ли считать эти правки корректными? Код компилируется
#include <iostream>
template <typename T = int>
typename std::common_type<T>::type func() {
return 0;
}
template<typename T, typename...A>
typename std::common_type<T, A...>::type func(T s, A...args) {
return s + func(args...);
}
int main()
{
std::cout << func(4.9, 1.7, 11, 19.6, 23) << std::endl;
return 0;
}
Ответы (1 шт):
какой возвратный тип используется "под" auto
Непонятен ход мыслей. Что не так с auto
? (Или с decltype
?)
Если вы спрашиваете, есть ли в <type_traits>
какой-то шаблон, который выдает возвращаемый тип +
, то ответ - нет. И непонятно, зачем он был бы нужен, если можно руками написать decltype
.
тип можно вывести посредством std::common_type
Можно, но не для всех типов. Для чисел - работает, а для строк, например - нет. (Хотя для строк и сложение с 0
не работает...)
Через fold expressions было бы удобнее
Тело функции с ними будет выглядеть лучше, но с возвращаемым типом это никак не помогает.