Введение

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

Шаблоны и специализация

Шаблоны классов — это метаклассы: они представляют собой частичные абстрактные типы данных, предоставляющие компилятору инструкции о том, как создавать классы с нужными членами данных. Например, стандартные контейнеры C++ являются шаблонами классов. Когда программист использует вектор, он создает его экземпляр для конкретного типа данных, например, int, string или double. Каждый тип вектора приводит к созданию отдельного класса в объектном коде компилятора, каждый из которых работает с определенным типом данных. Этот процесс называется мономорфизацией обобщенных типов. Если известно, что шаблон класса будет часто использоваться с конкретным типом данных, и этот тип данных позволяет определенные оптимизации (например, побитовые сдвиги для целых чисел, в отличие от умножения или деления на 2), можно ввести специализированный шаблон класса с предварительно заданными некоторыми параметрами шаблона. Когда компилятор обнаруживает такой шаблон класса, инстанцированный в коде, он обычно выбирает наиболее специализированное определение шаблона, соответствующее инстанцированию. Следовательно, явная полная специализация (где указаны все аргументы шаблона) будет предпочтительнее частичной специализации, если все аргументы шаблона совпадают.

Частичная специализация

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