C++ Шаблоны функций: вывод массивов разных типов

Шаблоны функций – важная составляющая языка C++. Они позволяют сократить код и сделать его более прозрачным, улучшая читаемость и понимание. Благодаря шаблонам отпадает необходимость в написании множества перегруженных функций для разных типов данных.

Вывод массивов разных типов

Рассмотрим задачу вывода на экран массивов различных типов данных: integer, double, float и char. Без использования шаблонов для каждого типа пришлось бы писать отдельную функцию.

Сначала определим размерность каждого массива с помощью констант:

const int iSize = 3;
const int dSize = 2;
const int fSize = 3;
const int cSize = 5;

Затем создадим массивы:

int intArr[iSize] = {1, 2, 3};
double doubleArr[dSize] = {1.1, 2.2};
float floatArr[fSize] = {1.1f, 2.2f, 3.3f};
char charArr[cSize] = {'a', 'b', 'c', 'd', 'e'};

Без шаблонов, для вывода каждого массива потребуется отдельная функция:

void printIntArray(int* arr, int size) {
  for (int i = 0; i < size; ++i) {
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
}

// Аналогично функции для double, float и char

Код получается громоздким и неэффективным. Четыре функции выполняют одну и ту же операцию, отличаясь лишь типом данных.

Шаблоны функций: решение проблемы

Шаблоны позволяют создать одну функцию, способную работать с различными типами данных. Перед объявлением функции используется ключевое слово template, за которым в угловых скобках указывается тип данных:

template <typename T>
void printArray(T* arr, int size) {
  for (int i = 0; i < size; ++i) {
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
}

Теперь функция printArray может работать с любым типом данных, переданным в качестве параметра T. Вызов функции упрощается:

printArray(intArr, iSize);
printArray(doubleArr, dSize);
printArray(floatArr, fSize);
printArray(charArr, cSize);

Шаблоны функций с двумя типами данных

Рассмотрим пример с двумя типами данных. Функция будет возвращать значение типа T2, подсчитывая количество элементов в массиве типа T1:

template <typename T1, typename T2>
T2 countElements(T1* arr, int size) {
  T2 count = 0;
  for (int i = 0; i < size; ++i) {
    count++;
  }
  return count;
}

Вызов функции:

int countInt = countElements(intArr, iSize);
std::cout << "Количество элементов в intArr: " << countInt << std::endl;

// аналогично для других типов

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

Использование шаблонов функций значительно упрощает код, делает его более читаемым и эффективным, избавляя от необходимости писать множество похожих функций для разных типов данных. Это важный инструмент для повышения качества и производительности программ на C++.

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