Простая программа без шаблонов функций
Программа выводит элементы массива на экран. Функция принимает указатель на первый элемент и количество элементов.
void Print(int* arr, int len) {
for (int i = 0; i < len; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
Пример использования:
int arr1[] = {1, 2, 3, 4, 5, 6};
Print(arr1, 6);
Проблема перегрузки функций
Для вывода массива чисел с плавающей точкой нужна новая функция или перегрузка существующей. Без шаблонов приходится создавать отдельную функцию для каждого типа данных:
void Print(float* arr, int len) {
for (int i = 0; i < len; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
float arr2[] = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f};
Print(arr2, 6);
Это неудобно и приводит к избыточному коду.
Шаблонные функции: решение проблемы
Шаблонные функции позволяют передавать тип данных в качестве параметра.
template <typename T>
void Print(T* arr, int len) {
for (int i = 0; i < len; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
template <typename T> объявляет шаблонную функцию. typename T определяет параметр типа. Функция Print теперь работает с массивами любого типа.
Пример использования:
Print<int>(arr1, 6);
Print<float>(arr2, 6);
Компилятор подставляет тип данных в зависимости от аргументов. Если тип не указан явно, компилятор пытается определить его автоматически.
Использование нескольких типов данных
Шаблонная функция может принимать несколько типов данных:
template <typename T1, typename T2>
void Print2(T1* arr, T2 len) {
for (T2 i = 0; i < len; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
T1 – тип элементов массива, T2 – тип переменной len.
Шаблонные функции — мощный инструмент C++, позволяющий писать гибкий и эффективный код, избегая дублирования. Они позволяют создавать функции, работающие с различными типами данных, упрощая разработку и поддержку программного обеспечения.