Введение

Шаблоны — это средство языка программирования C++, позволяющее функциям и классам работать с обобщенными типами. Это позволяет объявлению функции или класса ссылаться через обобщенную переменную на другой класс (встроенный или вновь объявленный тип данных), не создавая отдельное объявление для каждого из этих классов. Говоря простыми словами, шаблонный класс или функция эквивалентны (до "компиляции") копированию и вставке шаблонного блока кода в место его использования с последующей заменой параметра шаблона на конкретный тип. По этой причине классы, использующие шаблонные методы, размещают реализацию в заголовочных файлах (*.h), поскольку ни один символ не может быть скомпилирован без предварительного знания типа. Стандартная библиотека C++ предоставляет множество полезных функций, организованных в виде взаимосвязанных шаблонов. Основными источниками вдохновения для шаблонов C++ стали параметризованные модули языка CLU и обобщения языка Ada.

Технический обзор

Существует три вида шаблонов: шаблоны функций, шаблоны классов и, начиная с C++14, шаблоны переменных. Начиная с C++11, шаблоны могут быть как вариативными, так и невариативными; в более ранних версиях C++ они всегда были невариативными.

Шаблоны классов

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

Специализация шаблонов

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

Вариадические шаблоны

В C++11 были введены вариадические шаблоны, которые могут принимать переменное число аргументов, подобно вариадическим функциям, таким как std::printf.