Различия между шаблонами языка C++ и универсальными шаблонами языка C# (Руководство по программированию в C#)
Универсальные шаблоны C# и шаблоны C++ — это возможности языков программирования, обеспечивающие поддержку параметризированных типов. Однако между ними существует немало различий. На уровне синтаксиса универсальные шаблоны C# представляют собой более простой способ работы с параметризованными типами без сложностей, связанных с шаблонами C++. Кроме того, C# не пытается предоставить все функции, предоставляемые шаблонами C++. На уровне реализации основное различие заключается в том, что замена универсальных типов C# осуществляется во время выполнения, а значит для объектов, экземпляры которых при этом создаются, сохраняются данные об универсальных типах. Дополнительные сведения см. в разделе "Универсальные" в среде выполнения.
Основные различия между универсальными шаблонами C# и шаблонами C++ состоят в следующем:
Универсальные шаблоны C# не дают такую же гибкость, как шаблоны C++. Например, в универсальном классе C# нельзя вызывать арифметические операторы, но можно вызывать операторы, определенные пользователем.
C# не позволяет использовать параметры шаблонов, не являющиеся типами, такие как
template C<int i> {}
.C# не поддерживает явную специализацию, т. е. индивидуальную реализацию шаблона для конкретного типа.
C# не поддерживает частичную специализацию, т. е. индивидуальную реализацию для подмножества аргументов типа.
C# не позволяет использовать параметр типа в качестве базового класса для универсального типа.
C# не позволяет параметрам типов иметь типы по умолчанию.
В C# параметр универсального типа сам по себе не может быть универсальным, однако в качестве универсальных типов можно использовать сконструированные типы. C++ не позволяет использовать параметры шаблонов.
C++ позволяет использовать код, который может быть недопустимым для всех параметров типа в шаблоне, а затем проверяет, используется ли в качестве параметра типа определенный тип. C# требует, чтобы код в классе был написан так, чтобы он работал с любым типом, соответствующим ограничениям. Например, в C++ можно написать функцию, которая применяет арифметические операторы
+
и-
к объектам параметра типа, в связи с чем при создании экземпляра шаблона, тип которого не поддерживает эти операторы, возникает ошибка. C# этого не позволяет; допускаются только те языковые конструкции, которые можно вывести из ограничений.