Создание шаблона класса с 1 параметром типа

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Valera97
Сообщения: 4
Зарегистрирован: 13 июн 2017, 13:58

13 июн 2017, 14:01

Создание шаблона класса с 1 параметром типа
Чтобы можно было описать параметизированую функцию вычисления среднего арифметического значения массива элементов
По типу :
Template<Typename T>
Class...
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 июн 2017, 15:36

Что именно не получается?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Valera97
Сообщения: 4
Зарегистрирован: 13 июн 2017, 13:58

13 июн 2017, 15:42

Вприницпе не могу понять как осуществить . Есть код для кода идёт использование просто классов . А как это реализовать не могу разобраться

Код: Выделить всё

#include <iostream>
#include <ctime>
#include <clocale>
template< typename T >
T avg( const T* arr, unsigned int size_arr )
{
    T sum = 0;
    for ( unsigned int i = 0; i < size_arr; ++i )
    sum += arr[ i ];
    return sum / size_arr;
}
int main(void)
{
    setlocale(LC_ALL,"Rus");
    srand(time(0));
    const int length_array = 10;
    int vector[length_array];
    double vectorDouble[length_array];
 
    for (int counter = 0; counter < length_array; counter++)
    {
        vector[counter] = rand() % 100;
        vectorDouble[counter] = vector[counter];
        std::cout << vector[counter] << " ";
    }
 
    std::cout << "\nсреднее арифметическое DOUBLE = " << avg<double>(vectorDouble, length_array) << std::endl;
    std::cout << "\nсреднее арифметическое INT = " 
<< avg<int>(vector, length_array)<< std::endl;
    system("pause");
    return (int)NULL;
}
 
 
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

13 июн 2017, 16:01

Перечитай, что ты написал. Там несвязный набор слов.

Я правильно понимаю, что из шаблонной функции нужно сделать шаблонный класс? При это функция должна стать статическим методом класса, верно?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Valera97
Сообщения: 4
Зарегистрирован: 13 июн 2017, 13:58

14 июн 2017, 03:20

Именно так
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

14 июн 2017, 16:08

Тогда вообще не вижу проблемы:

Код: Выделить всё

template <class T>
class Utils
{
public:
   T avg( const T* arr, unsigned int size_arr )
   { ... }
};

int main()
{
   ...
   Utils<double>::avg(vectorDouble, length_array);
   ...
}

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Valera97
Сообщения: 4
Зарегистрирован: 13 июн 2017, 13:58

15 июн 2017, 04:47

Просто понять не могу в чем отличие идёт ?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 июн 2017, 22:20

В том, что первый вариант параметризует отдельную функцию, а второй - весь класс.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить