Шаблоны — введение в обобщенное программирование

Упражнения на проектирование простых шаблонов

Методика сдачи и проверки этих задач точно такая же, как в заданиях на проектирование дроби: вы должны сдать на проверку только реализацию соответствующей функции (возможно и других необходимых вспомогательных функций), но без функции main.

A: Знак числа

Реализуйте шаблон функции

template <typename T>
int sign(T a)

возвращающей знак числа, то есть значение 1, -1 или 0.

B: Алгоритм Евклида

Реализуйте шаблон функции

template <typename T>
T gcd(T a, T b)

возвращающей наибольший общий делитель чисел a и b, в предположении, что T — целочисленный тип, числа a и b неотрицательные и неравны нулю одновременно.

Напишите нерекурсивную реализацию алгоритма Евклида (при помощи цикла while).

В этой задаче T может быть и значением типа char (char тоже целочисленный тип), при этом оператор взятия остатка от деления для типа char возвращает значение типа int для аргументов типа char, эти грабли нужно обойти.

C: Обмен

Реализуйте шаблон функции

template <typename T>
void Swap(T & a, T & b)

меняющей значения двух переменных местами.

D: Максимум

Реализуйте шаблон функции

template <typename T>
T Max(vector<T> & a)

возвращающей значение наибольшего элемента в векторе a, в предположении, что вектор a не пуст.

Использование функций из заголовочного файла <algorithm> запрещено.

E: Вывод вектора

Реализуйте шаблон оператора << для вывода вектора:

template <typename T>
ostream & operator<<(ostream & out, vector<T> & a)

Элементы вектора разделяются пробелом, конец строки выводить не нужно, после последнего выведенного элемента выводить пробел не нужно.

F: Максимальное целое число

Реализуйте шаблон функции

template <typename T>
T max_int()

возвращающий максимальное целое число, которое можно записать в знаковом целочисленном типе T. Можно использовать битовые операции, представление о способе хранения целых чисел в памяти.

G: Машинное эпсилон

Реализуйте шаблон функции

template <typename T>
T eps()

возвращающий машинное эпсилон для данного действительного типа T.