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


Универсальные функции (C++/CLI)

Универсальная функция — это функция, объявляемая с параметрами типа. При ее вызове вместо параметров типа используются фактические типы.

Все платформы

Замечания

Эта функция не применяется ко всем платформам.

Среда выполнения Windows

Замечания

Эта функция не поддерживается в среда выполнения Windows.

Требования

Неприменимо.

Среда CLR

Универсальная функция — это функция, объявленная с параметрами универсального типа. При ее вызове вместо параметров типа используются фактические типы.

Синтаксис

generic-declaration:
generic < generic-parameter-list >необ.constraint-clause-list function-definition

generic-parameter-list:
generic-parameter
generic-parameter-list , generic-parameter

generic-parameter:
attributesнеоб. class identifier
attributesнеоб. typename identifier

constraint-clause-list:
constraint-clause-listнеоб. constraint-clause

constraint-clause:
where identifier : constraint-item-list

constraint-item-list:
constraint-item
constraint-item-list , constraint-item

constraint-item:
type-id
ref class
ref struct
value class
value struct
gcnew ( )

generic-id:
generic-name < generic-argument-list >

generic-name:
identifier
operator-function-id

generic-argument-list:
generic-argument
generic-argument-list , generic-argument

generic-argument:
type-id

Параметры

generic-parameter-list
Разделенный запятыми список необязательных идентификаторов параметров универсального типа.

attributes
(Необязательно) Дополнительные декларативные сведения. Дополнительные сведения об атрибутах и классах атрибутов см. в разделе "Атрибуты".

constraint-clause-list
Этот необязательный список указывает ограничения на типы, которые могут использоваться в качестве аргументов типа. Он принимает форму, указанную в ограничениях для параметров универсального типа (C++/CLI).

function-definition
Определение метода или автономной функции. Функция может не иметь virtual модификатора, который не допускается, так как виртуальные методы не могут быть универсальными. Текст функции может ссылаться на идентификаторы параметров универсального типа. Функция может быть функцией operator .

generic-id
При вызове экземпляра универсальной функции необходимо указать типы, используемые для его реализации в generic-argument-list. Этот список соответствует generic-parameter-listограничениям необязательного constraint-clause-list.

generic-name
Универсальная функция может иметь identifier имя или может быть функцией operator .

Замечания

Универсальные функции — это функции, объявленные с одним или несколькими параметрами универсального типа. Они могут быть методами в class функциях или structавтономных функциях. В одном универсальном объявлении неявно объявляется семейство функций, отличающихся только подстановкой различных фактических типов вместо параметра универсального типа.

struct Конструктор class может не объявляться с параметрами универсального типа.

При вызове параметр универсального типа заменяется фактическим типом. Фактический тип может быть явно указан в угловых скобках с использованием синтаксиса, аналогичного вызову шаблона функции. При вызове без параметров типа компилятор будет пытаться определить фактический тип по параметрам, указанным в вызове функции. Компилятор сообщает об ошибке, если аргумент предполагаемого типа не может быть выведен из используемых параметров.

Требования

Параметр компилятора: /clr

Примеры

В следующем примере кода демонстрируется универсальная функция.

// generics_generic_function_1.cpp
// compile with: /clr
generic <typename ItemType>
void G(int i) {}

ref struct A {
   generic <typename ItemType>
   void G(ItemType) {}

   generic <typename ItemType>
   static void H(int i) {}
};

int main() {
   A myObject;

   // generic function call
   myObject.G<int>(10);

   // generic function call with type parameters deduced
   myObject.G(10);

   // static generic function call
   A::H<int>(10);

   // global generic function call
   G<int>(10);
}

Универсальные функции могут быть перегружены на основе сигнатуры или arity, количества параметров типа в функции. Они также могут перегружаться неуниверсальными функциями с таким же именем, если функции отличаются некоторыми параметрами типа. Например, могут перегружаться следующие функции:

// generics_generic_function_2.cpp
// compile with: /clr /c
ref struct MyClass {
   void MyMythod(int i) {}

   generic <class T>
   void MyMythod(int i) {}

   generic <class T, class V>
   void MyMythod(int i) {}
};

В следующем примере используется универсальная функция, чтобы найти первый элемент массива. В примере объявляется класс MyClass, который наследуется от базового класса MyBaseClass. MyClass содержит универсальную функцию MyFunction, вызывающую другую универсальную функцию MyBaseClassFunction в базовом классе. В main универсальная функция MyFunction вызывается с использованием разных аргументов типа.

// generics_generic_function_3.cpp
// compile with: /clr
using namespace System;

ref class MyBaseClass {
protected:
   generic <class ItemType>
   ItemType MyBaseClassFunction(ItemType item) {
      return item;
   }
};

ref class MyClass: public MyBaseClass {
public:
   generic <class ItemType>
   ItemType MyFunction(ItemType item) {
      return MyBaseClass::MyBaseClassFunction<ItemType>(item);
   }
};

int main() {
   MyClass^ myObj = gcnew MyClass();

   // Call MyFunction using an int.
   Console::WriteLine("My function returned an int: {0}",
                           myObj->MyFunction<int>(2003));

   // Call MyFunction using a string.
   Console::WriteLine("My function returned a string: {0}",
   myObj->MyFunction<String^>("Hello generic functions!"));
}
My function returned an int: 2003
My function returned a string: Hello generic functions!

См. также

Расширения компонентов для .NET и UWP
Универсальные шаблоны