C++ для начинающих: Шаблоны функций (templates)

Простая программа без шаблонов функций

Программа выводит элементы массива на экран. Функция принимает указатель на первый элемент и количество элементов.

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++, позволяющий писать гибкий и эффективный код, избегая дублирования. Они позволяют создавать функции, работающие с различными типами данных, упрощая разработку и поддержку программного обеспечения.

Что будем искать? Например,программа