Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Параметры универсального типа можно использовать с делегатами. Дополнительные сведения о делегатах (C++/CLI и C++/CX) см. здесь.
Синтаксис
[attributes]
generic < [class | typename] type-parameter-identifiers>
[type-parameter-constraints-clauses]
[accessibility-modifiers] delegate result-type identifier
([formal-parameters]);
Параметры
attributes
(Необязательно) Дополнительные описательные данные. Дополнительные сведения об атрибутах и классах атрибутов см. в разделе Атрибуты.
type-parameter-identifier(s)
Разделенный запятыми список идентификаторов параметров типа.
type-parameter-constraints-clauses
Принимает вид, определенный в статье Constraints on Generic Type Parameters (C++/CLI) (Ограничения, применяемые к параметрам универсальных типов (C++/CLI)).
accessibility-modifiers
(Необязательно) Модификаторы специальных возможностей (напримерpublic, ). private
result-type
Возвращаемый тип делегата.
идентификатор
Имя делегата.
formal-parameters
(Необязательно) Список параметров делегата.
Примеры
Параметры типа делегата определяются в точке создания объекта делегата. Делегат и связанный с ним метод должны иметь одинаковую сигнатуру. В следующем примере показано объявление универсального делегата.
// generics_generic_delegate1.cpp
// compile with: /clr /c
generic <class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
В приведенном ниже примере показано, что:
один и тот же объект делегата нельзя использовать с разными сконструированными типами; для разных типов следует создать разные объекты делегатов;
универсальный делегат может быть связан с универсальным методом;
если универсальный метод вызывается без указания аргументов типа, компилятор пытается определить аргументы типа для вызова.
// generics_generic_delegate2.cpp
// compile with: /clr
generic <class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
generic <class ItemType>
ref struct MyGenClass {
ItemType MyMethod(ItemType i, ItemType % j) {
return ItemType();
}
};
ref struct MyClass {
generic <class ItemType>
static ItemType MyStaticMethod(ItemType i, ItemType % j) {
return ItemType();
}
};
int main() {
MyGenClass<int> ^ myObj1 = gcnew MyGenClass<int>();
MyGenClass<double> ^ myObj2 = gcnew MyGenClass<double>();
GenDelegate<int>^ myDelegate1 =
gcnew GenDelegate<int>(myObj1, &MyGenClass<int>::MyMethod);
GenDelegate<double>^ myDelegate2 =
gcnew GenDelegate<double>(myObj2, &MyGenClass<double>::MyMethod);
GenDelegate<int>^ myDelegate =
gcnew GenDelegate<int>(&MyClass::MyStaticMethod<int>);
}
В следующем примере объявляется универсальный делегат GenDelegate<ItemType>, а затем создается его экземпляр путем связывания с методом MyMethod, использующим параметр типа ItemType. Создаются и вызываются два экземпляра делегата (целое число и число двойной точности).
// generics_generic_delegate.cpp
// compile with: /clr
using namespace System;
// declare generic delegate
generic <typename ItemType>
delegate ItemType GenDelegate (ItemType p1, ItemType% p2);
// Declare a generic class:
generic <typename ItemType>
ref class MyGenClass {
public:
ItemType MyMethod(ItemType p1, ItemType% p2) {
p2 = p1;
return p1;
}
};
int main() {
int i = 0, j = 0;
double m = 0.0, n = 0.0;
MyGenClass<int>^ myObj1 = gcnew MyGenClass<int>();
MyGenClass<double>^ myObj2 = gcnew MyGenClass<double>();
// Instantiate a delegate using int.
GenDelegate<int>^ MyDelegate1 =
gcnew GenDelegate<int>(myObj1, &MyGenClass<int>::MyMethod);
// Invoke the integer delegate using MyMethod.
i = MyDelegate1(123, j);
Console::WriteLine(
"Invoking the integer delegate: i = {0}, j = {1}", i, j);
// Instantiate a delegate using double.
GenDelegate<double>^ MyDelegate2 =
gcnew GenDelegate<double>(myObj2, &MyGenClass<double>::MyMethod);
// Invoke the integer delegate using MyMethod.
m = MyDelegate2(0.123, n);
Console::WriteLine(
"Invoking the double delegate: m = {0}, n = {1}", m, n);
}
Invoking the integer delegate: i = 123, j = 123
Invoking the double delegate: m = 0.123, n = 0.123