Поделиться через


Различия между шаблонами языка 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# этого не позволяет; допускаются только те языковые конструкции, которые можно вывести из ограничений.

См. также