Универсальные функции (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!