Основные принципы обобщенного программирования, его достоинства и недостатки.
Принцип обобщенного программирования исходит из того, что большинство используемых в программе(-ах) алгоритмов идентичны [1]. Это касается и популярных алгоритмов, таких как быстрая сортировка или двоичный поиск, и обработки данных в таких распространенных структурах данных, как связный список или двоичное дерево. Поэтому понятно желание сформулировать код, реализующий подобную обработку, в наиболее общей формы, без конкретизации типов данных. При если язык является строго типизированным, для такого обобщения придется либо определять несколько реализаций функции (класса) для каждого из используемых в программе типов, либо объявлять параметры нетипизированными, уточняя их при вызове. Однако, эти решения не выглядят эффективными прежде всего по объему идентичного кода, который придется писать в программе.
Обобщённое программирование – это такой подход к разработке программного обеспечения, при котором производится абстрактное описание алгоритма решения задачи вне связи с конкретной природой данных, для которых этот алгоритм будет выполняться. Такая программа может быть написана и отлажена только один раз, и затем использоваться для данных различных типов.
Следует отметить, что, как и любую возможность, обобщённое программирование следует применять только тогда, когда для этого есть реальные условия. В противном случае, если применять средства обобщённого программирования ради самого обобщённого программирования мы получим неэффективную и непонятную программу.
Обобщение функций и методов: синтаксис определения, инстанцирование, особенности использования.
Шаблон функции представляет собой обобщение некоторого алгоритма, которое может применяться к данным различных типов. При этом конкретизация типов данных, над которыми функция должна выполнять операции, передается ей в виде параметра на стадии компиляции.
Шаблон функции в С++ определяется с использованием ключевого слова template [5]:
template <typename тип_данных> тип_возвр_значения
Имя_функции(список_параметров)
{тело_функции}
или
template <class тип_данных> тип_возвр_значения