Введение
Шаблоны — это средство языка программирования C++, позволяющее функциям и классам работать с обобщенными типами. Это позволяет объявлению функции или класса ссылаться через обобщенную переменную на другой класс (встроенный или вновь объявленный тип данных), не создавая отдельное объявление для каждого из этих классов. Говоря простыми словами, шаблонный класс или функция эквивалентны (до "компиляции") копированию и вставке шаблонного блока кода в место его использования с последующей заменой параметра шаблона на конкретный тип. По этой причине классы, использующие шаблонные методы, размещают реализацию в заголовочных файлах (*.h), поскольку ни один символ не может быть скомпилирован без предварительного знания типа. Стандартная библиотека C++ предоставляет множество полезных функций, организованных в виде взаимосвязанных шаблонов. Основными источниками вдохновения для шаблонов C++ стали параметризованные модули языка CLU и обобщения языка Ada.
Templates are a feature of the C++ programming language that allows functions and classes to operate with generic types. This allows a function or class declaration to reference via a generic variable another different class (built in or newly declared data type) without creating full declaration for each of these different classes. In plain terms, a templated class or function would be the equivalent of (before "compiling") copying and pasting the templated block of code where it is used, and then replacing the template parameter with the actual one. For this reason, classes employing templated methods place the implementation in the headers (*. h files) as no symbol could be compiled without knowing the type beforehand. The C++ Standard Library provides many useful functions within a framework of connected templates. Major inspirations for C++ templates were the parameterized modules provided by the language CLU and the generics provided by Ada.
Технический обзор
Существует три вида шаблонов: шаблоны функций, шаблоны классов и, начиная с C++14, шаблоны переменных. Начиная с C++11, шаблоны могут быть как вариативными, так и невариативными; в более ранних версиях C++ они всегда были невариативными.
Шаблоны классов
Шаблон класса предоставляет спецификацию для создания классов на основе параметров. Шаблоны классов обычно используются для реализации контейнеров. Шаблон класса инстанцируется путем передачи ему определенного набора типов в качестве аргументов шаблона. Стандартная библиотека C++ содержит множество шаблонов классов, в частности контейнеры, адаптированные из Стандартной библиотеки шаблонов, такие как vector.
Специализация шаблонов
Когда функция или класс инстанцируются из шаблона, компилятор создает специализацию этого шаблона для использованного набора аргументов, и эта специализация называется сгенерированной специализацией.
Вариадические шаблоны
В C++11 были введены вариадические шаблоны, которые могут принимать переменное число аргументов, подобно вариадическим функциям, таким как std::printf.