Глава.19. Классы-шаблоны___________________________________573

Введение в родовое программирование: шаблоны

В какой-то степени рождение идеи параметризованных типов было обусловлено высокой стоимостью разработки программного обеспечения. Ежегодно в программное обеспечение вкладываются миллионы долларов, поэтому все время идет поиск путей сокращения стоимости и времени разработки. Один из таких путей — разработка кода в виде, пригодном для многократного использования. .Шаблоны в этом отношении являются очень выгодным средством: в идеале одна-единственная реализация алгоритма способна работать с любыми типами данных.

В главе 4 рассказывалось о том, как параметризованные типы можно реализовать в виде макросов и как препроцессор приводит их в понятный компилятору вид. Теперь же шаблоны (вот уже более пяти лет) выступают как полноправные языковые средства со своим собственным синтаксисом.

*

Для понимания обсуждаемых в этой главе проблем необходимо иметь представление о базовых типах данных, о классах и о специальных функциях-членах классов: конструкторе копий и операции присваивания. Без этих знаний шаблоны покажутся очень сложными или вообще непостижимыми. Чтобы вспомнить указанные темы, обратитесь к главам 6 "Базовые типы данных и операции", 14 "Базовые концепции классов" и 17 "Конструкторы:

копирование и присваивание". Дальнейший материал излагается в предположении, что вы прочитали и поняли все, что в них написано.

Какие типы данных можно использовать?

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

Как вы уже знаете, параметризованные типы позволяют разработчикам реализовать независимые от типа данных алгоритмы. C++ — язык отнюдь не жесткий; C++ — язык строго типизированный, но предоставляемые им возможности обеспечивают огромный простор для творчества и изобретательности.

Копирование и присваивание

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

17 Змг.ЗОб