Весь мой канал Old Programmer здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои ресурсы по языкам C и C++.
Шаблоны функций в C++
Шаблон представляет собой обобщенное определение функции. Когда компилятор по шаблону создает функцию, говорят, что он создал порожденную функцию. Синтаксис шаблона функции в общем случае можно представить следующим образом.
template <class T1|T1 идент1, … class Tn|Tn идентn>
тип_функции имя_функции(список параметров)
Параметры в угловых скобках являются либо ключевое слово class, за которым следует имя типа, либо имя типа, за которым следует идентификатор.
Пример 1.
template <class T> void swap(T &a, T &b)
{
T c;
c=b; b=a; a=c;
}
Шаблон swap дает макет функции перестановки двух переменных. Тип параметров не определен, и компилятор будет исходить из того, как функция будет употреблена в тексте программы. Например, если i и j целые переменные, то swap(i,j) будет осуществлять обмен между этими переменными. Но если s1 и s2 указатели на строки, то swap(s1,s2) будет осуществлять перестановку строк (конечно, переставляются указатели, но надеюсь, Вы это понимаете). Компилятором, конечно, будет создано две функции, одна для перестановки целых чисел, другая – строк.
Пример 2.
template <class T> T mul(T par, int a)
{
return par*a;
}
Данный шаблон определяет произведение двух параметров, причем первый параметр может быть как целого, так и другого числового типа. Возвращаемый тип совпадает с типом первого параметра. Вместо ключевого слова class в шаблонах функций можно использовать слово typename, которое в смысловом отношении более естественно в данном контексте.
Пример программы с использованием шаблонов функций
Рассмотрим пример функции print (см. tm4000.cpp). Она приспособлена для печати переменных разных типов. Да, большого выигрыша мы здесь не имеем. Но функцию можно и развить, добавив какие-то дополнительные преобразования. Скорее это просто демонстрация того, как функционирует шаблон функции.
Конечно, шаблоны функций - это не панацея. Если обработка параметров будет отличаться алгоритмически в зависимости от их типов, то здесь сразу встречаемся с труднопреодолимой проблемой.
Представленные примеры можно реализовать просто перегрузкой функций. Но в данном случае с помощью шаблона мы прячем эту перегрузку, делая код более компактным.
Пока, любители великого и ужасного языка C++. Подписываемся на мой канал Old Programmer.
Список разделов канала Old Programmer, канала о программировании и программистах.