Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Частичная специализация шаблонов — это особая форма специализации шаблонов классов. Обычно используется применительно к языку программирования C++, она позволяет программисту специализировать только некоторые аргументы шаблона класса, в отличие от явной полной специализации, где указываются все аргументы шаблона.
Partial template specialization is a particular form of class template specialization. Usually used in reference to the C++ programming language, it allows the programmer to specialize only some arguments of a class template, as opposed to explicit full specialization, where all the template arguments are provided.
Шаблоны и специализация
Шаблоны классов — это метаклассы: они представляют собой частичные абстрактные типы данных, предоставляющие компилятору инструкции о том, как создавать классы с нужными членами данных. Например, стандартные контейнеры C++ являются шаблонами классов. Когда программист использует вектор, он создает его экземпляр для конкретного типа данных, например, int, string или double. Каждый тип вектора приводит к созданию отдельного класса в объектном коде компилятора, каждый из которых работает с определенным типом данных. Этот процесс называется мономорфизацией обобщенных типов. Если известно, что шаблон класса будет часто использоваться с конкретным типом данных, и этот тип данных позволяет определенные оптимизации (например, побитовые сдвиги для целых чисел, в отличие от умножения или деления на 2), можно ввести специализированный шаблон класса с предварительно заданными некоторыми параметрами шаблона. Когда компилятор обнаруживает такой шаблон класса, инстанцированный в коде, он обычно выбирает наиболее специализированное определение шаблона, соответствующее инстанцированию. Следовательно, явная полная специализация (где указаны все аргументы шаблона) будет предпочтительнее частичной специализации, если все аргументы шаблона совпадают.
Class templates are really meta classes: they are partial abstract data types that provide instructions to the compiler on how to create classes with the proper data members. For example, the C++ standard containers are class templates. When a programmer uses a vector, one instantiates it with a specific data type, for example, int, string or double. Each type of vector results in a different class in the compiler's object code, each one working with a different data type. This process is called monomorphization of generics. If one knows that a class template will be used with a specific data type fairly often and this data type allows some optimizations (e. g. bit shifting with integers, as opposed to multiplying or dividing by 2), one may introduce a specialized class template with some of the template parameters preset. When the compiler sees such a class template instantiated in code, it will generally choose the most specialized template definition that matches the instantiation. Therefore, an explicit full specialization (one where all the template arguments are specified) will be preferred to a partial specialization if all the template arguments match.
Частичная специализация
Шаблоны могут иметь несколько типов параметров. Некоторые старые компиляторы позволяют специализировать либо все параметры шаблона, либо ни один из них. Компиляторы, поддерживающие частичную специализацию, позволяют программисту специализировать часть параметров, оставляя остальные обобщёнными.
Templates can have more than one parameter type. Some older compilers allow one only to specialize either all or none of the template's parameters. Compilers that support partial specialization allow the programmer to specialize some parameters while leaving the others generic.