Глава.19. Классы-шаблоны___________________________________573
Введение в родовое программирование: шаблоны
В какой-то степени рождение идеи параметризованных типов было обусловлено высокой стоимостью разработки программного обеспечения. Ежегодно в программное обеспечение вкладываются миллионы долларов, поэтому все время идет поиск путей сокращения стоимости и времени разработки. Один из таких путей — разработка кода в виде, пригодном для многократного использования. .Шаблоны в этом отношении являются очень выгодным средством: в идеале одна-единственная реализация алгоритма способна работать с любыми типами данных.
В главе 4 рассказывалось о том, как параметризованные типы можно реализовать в виде макросов и как препроцессор приводит их в понятный компилятору вид. Теперь же шаблоны (вот уже более пяти лет) выступают как полноправные языковые средства со своим собственным синтаксисом.
*
Для понимания обсуждаемых в этой главе проблем необходимо иметь представление о базовых типах данных, о классах и о специальных функциях-членах классов: конструкторе копий и операции присваивания. Без этих знаний шаблоны покажутся очень сложными или вообще непостижимыми. Чтобы вспомнить указанные темы, обратитесь к главам 6 "Базовые типы данных и операции", 14 "Базовые концепции классов" и 17 "Конструкторы:
копирование и присваивание". Дальнейший материал излагается в предположении, что вы прочитали и поняли все, что в них написано.
Какие типы данных можно использовать?
Как мы увидим ниже, параметрами шаблонов могут быть все встроенные и практически все мыслимые производные типы данных. Спецификаторы шаблонов используются в комбинации с классами или функциями, поэтому до сих пор мы намеренно не рассматривали их синтаксис.
Как вы уже знаете, параметризованные типы позволяют разработчикам реализовать независимые от типа данных алгоритмы. C++ — язык отнюдь не жесткий; C++ — язык строго типизированный, но предоставляемые им возможности обеспечивают огромный простор для творчества и изобретательности.
Копирование и присваивание
Проблемы с родовыми функциями возникают при использовании их с типами данных, у которых функции копирования и присваивания не определены должным образом. Присваивание большинства базовых типов данных выполняется автоматически, но для сложных пользовательских типов эти
17 Змг.ЗОб