Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 1
Регистрация: 06.03.2016
Сообщений: 64
1

Шаблон функции с переменным количеством параметров и среднее арифметическое

05.03.2017, 08:29. Просмотров 1819. Ответов 8


Никак не могу придумать, как вычислить среднее арифметическое. Получилось найти сумму, а вот количество элементов постоянно меняется и sizeof...(TR) не помогает. Нужно как-то сохранить изначальное значение.

C++
1
2
3
4
5
6
7
template<typename T> T summar(T val) {
    return val;
}
 
template <typename T, typename... TR> T summar(T num, TR ... args) {
    return num += summar(args...);
}
Код не нужен, просто прошу натолкнуть на мысль.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2017, 08:29
Ответы с готовыми решениями:

Шаблон с переменным количеством параметров
У меня компилятор Visual Studio 2012, но не работает следующий код: #include &lt;iostream&gt;...

Функции по переменным количеством параметров
нужна помощь по работе с такой функцией .. Искал в книге Страуструпа, не понял пример, помогите,...

Шаблон функции с переменным количеством аргументов
Добрый вечер, мне необходимо при помощи шаблона функции реализовать поиск минимального числа(тип...

Массив в функции с переменным количеством параметров
Добрый день. Не могу разобраться, как в функции с переменным количеством параметров сделать...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
8
Эксперт С++
1590 / 922 / 777
Регистрация: 06.02.2016
Сообщений: 2,409
Записей в блоге: 29
05.03.2017, 10:10 2
Если захочется посмотреть код
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
template<typename...Args>
double avg(Args&&...args) {
    double s=0;
    double a[]= {(s+=args)...};
    static_cast<void>(a);
    return s/sizeof...(args);
}
int main() {
    cout<<avg(2.1f,5.2,8u,5);
}
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
05.03.2017, 10:32 3
Лучший ответ Сообщение было отмечено WhiscasH как решение

Решение

Если захочется посмотреть другой код
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <type_traits>
#include <iostream>
 
template<typename T>
constexpr T summ(T v)
{
    return v;
}
 
template<typename T, typename... Args>
constexpr auto summ(T first, Args... args) -> std::common_type_t<T, Args...>
{
    return first + summ(args...);
}
 
template<typename T, typename... Args>
constexpr auto mean_value(T first, Args... args) -> std::common_type_t<T, Args...>
{
    return summ(first, args...) / (1 + sizeof...(Args));
}
 
int main()
{
    std::cout << mean_value(1.2, -2, 3.5, 4, -.5) << std::endl;
    return 0;
}
1
1 / 1 / 1
Регистрация: 06.03.2016
Сообщений: 64
05.03.2017, 10:46  [ТС] 4
Цитата Сообщение от Peoples Посмотреть сообщение
double a[]= {(s+=args)...};
static_cast<void>(a);
Не могли бы вы объяснить, что делают данные строчки?

Добавлено через 6 минут
Цитата Сообщение от retmas Посмотреть сообщение
Если захочется посмотреть другой код
Я не совсем понял, что там значат все эти constexpr и всякие стрелочки, но принцип понял. Спасибо.
Была идея ввести дополнительную функцию, но почему-то до конца довести не смог.
0
Эксперт С++
1590 / 922 / 777
Регистрация: 06.02.2016
Сообщений: 2,409
Записей в блоге: 29
05.03.2017, 10:51 5
WhiscasH, -> для "указания" типа auto

Добавлено через 1 минуту
C++
1
2
double a[]= {(s+=args)...}; // распаковываем аргументы 
* * static_cast<void>(a); // приводим массив к void
1
Любитель чаепитий
3536 / 1647 / 507
Регистрация: 24.08.2014
Сообщений: 5,602
Записей в блоге: 1
05.03.2017, 11:15 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template<typename... Args>
constexpr std::common_type_t<Args...> foo(Args&&... args)
{
    std::common_type_t<Args...> ret{};
    int dummy[] { (ret += std::forward<Args>(args), 0)... };
    (void)dummy;
    return ret / sizeof...(args);
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::cout << foo(1, 2, 3, 4.);
}
2
Peoples
05.03.2017, 11:21
  #7

Не по теме:

GbaLog-,

Цитата Сообщение от GbaLog- Посмотреть сообщение
{ (ret += std::forward<Args>(args), 0)... };
Всегда было интересно зачем здесь 0? :)

0
Любитель чаепитий
3536 / 1647 / 507
Регистрация: 24.08.2014
Сообщений: 5,602
Записей в блоге: 1
05.03.2017, 12:17 8
Цитата Сообщение от Peoples Посмотреть сообщение
Всегда было интересно зачем здесь 0?
Тут расписано всё очень подробно: https://www.cyberforum.ru/post9846430.html.
1
Эксперт С++
8412 / 3947 / 864
Регистрация: 15.11.2014
Сообщений: 8,894
05.03.2017, 12:18 9
Цитата Сообщение от Peoples Посмотреть сообщение
Всегда было интересно зачем здесь 0?

оператор запятая жеж.
он заполняет массив нулями и говорит компилятору,
что этот массив нафиг не нужен.
просто распаковал аргументы.

вообще, из всех представленных моделей,
№6 - самая грамотная.

Добавлено через 36 секунд
Цитата Сообщение от Peoples Посмотреть сообщение
Всегда было интересно зачем здесь 0?

оператор запятая жеж.
он заполняет массив нулями и говорит компилятору,
что этот массив нафиг не нужен.
просто распаковал аргументы.

вообще, из всех представленных моделей,
№6 - самая грамотная.

Добавлено через 13 секунд
Цитата Сообщение от Peoples Посмотреть сообщение
Всегда было интересно зачем здесь 0?

оператор запятая жеж.
он заполняет массив нулями и говорит компилятору,
что этот массив нафиг не нужен.
просто распаковал аргументы.

вообще, из всех представленных моделей,
№6 - самая грамотная.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2017, 12:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Функции с переменным количеством параметров в языке C ++
Реализовать функцию конкатенации (сцепления) произвольного количества C-строк с динамическим...

Функции с переменным количеством параметров, stdarg.h. Исправить код
Почему не работает? В итоге получается 0, а если в функции все что надо заменить с float на int, то...

Функция с переменным количеством параметров
Доброго времени суток! Я озадачился таким вопросом - как производится компиляция функций с...

Функция с переменным количеством параметров
Здравствуйте, возникла вот такая проблема: создаю функцию с переменным кол-ом параметров. Пример...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.