Obecní delegáti (Visual C++)
Můžete použít parametry obecný typ s delegáty.Další informace o delegáty, viz delegate (rozšíření komponent C++).
[attributes]
generic < [class | typename] type-parameter-identifiers >
[type-parameter-constraints-clauses]
[accessibility-modifiers] delegate result-type identifier
([formal-parameters]);
Parametry
attributes(Volitelné)
Další informace o deklarativní.Další informace o atributů a tříd atribut viz atributy.typ -parametr-identifikátor(s)
Čárkami oddělený seznam identifikátorů pro parametry typu.type-parameter-constraints-clauses
formulář určený trváOmezení parametrů obecných typů (C++/CLI)usnadnění-modifikátory (volitelné)
Modifikátory dostupnosti (napřpublic, private).výsledek typu
Návratový typ delegát.identifikátor
Jméno delegát.formální parametry (volitelné)
Seznam parametr delegát.
Příklad
Parametry typu delegát jsou uvedeny v bodě, kde je delegát objekt vytvořen.Jak delegát , metoda s ním spojené, musí mít stejný signatura.Následuje příklad prohlášení Obecné delegát .
// generics_generic_delegate1.cpp
// compile with: /clr /c
generic < class ItemType>
delegate ItemType GenDelegate(ItemType p1, ItemType% p2);
Následující příklad ukazuje, že
Stejný delegát objekt nelze použít s různými typy vyrobeny.Vytvoření objektů delegát různé pro různé typy.
Obecný delegát lze přidružit obecná metoda.
obecná metoda je volána bez zadávání argumentů typu, pokusí se kompilátor odvodit typ argumentů pro volání.
// 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>);
}
Následující příklad prohlašuje obecný delegátGenDelegate<ItemType>a vytvoří instanci přiřazením metoda MyMethod , která používá parametrtypuItemType. Dvě instance delegát (typu integer a typ double) jsou vytvořeny a vyvolat.
// 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);
}