delegate (rozšíření komponent C++)
Deklaruje typ, který představuje ukazatel na funkci.
Všechny moduly runtime
Jak architektura Windows Runtime, tak modul CLR podporují delegáty.
Poznámky
Klíčové slovo delegate je citlivé na kontext.Další informace naleznete v tématu Kontextově závislá klíčová slova (rozšíření komponent C++).
Chcete-li zjistit, zda je typ delegátem, v době kompilace, použijte příznak typu __is_delegate().Další informace naleznete v tématu Podpora kompilátoru pro typové vlastnosti (C++ Component Extensions).
Prostředí Windows Runtime
Jazyk C++/CX podporuje delegáty s následující syntaxí.
Syntaxe
access delegate return-type delegate-type-identifier ([ parameters ])
Parametry
access
(volitelné) Přístupnost delegáta, může být public (výchozí) nebo private.Prototyp funkce lze také kvalifikovat klíčovými slovy const nebo volatile.return-type
Návratový typ prototypu funkce.delegate-type-identifier
Název deklarovaného typu delegáta.parameters
(Volitelné) Typy a identifikátory prototypu funkce.
Poznámky
Chcete-li vytvořit událost s prototypem shodným s delegátem, použijte parametr delegate-type-identifier.Další informace naleznete v tématu týkajícím se delegátů (C++/CX).
Požadavky
Možnost kompilátoru: /ZW
Modul CLR (Common Language Runtime)
Modul CLR podporuje delegáty s následující syntaxí.
Syntaxe
access delegate function_declaration
Parametry
access
(volitelné) Přístupnost delegáta mimo sestavení může být public nebo private.Výchozí hodnotou je private.Uvnitř třídy může mít delegát jakoukoliv přístupnost.function_declaration
Signatura funkce, kterou lze svázat s delegátem.Návratový typ delegáta může být libovolný spravovaný typ.Z důvodu interoperability je vhodné, aby byl návratový typ delegáta typu CLS.Chcete-li definovat nevázaný delegát, měl by prvním parametrem v deklaraci funkce function_declaration být typ ukazatele this daného objektu.Další informace naleznete v tématu Nevázaný delegáty.
Poznámky
Delegáty jsou schopny vícenásobného volání: "ukazatel na funkci" může být svázán s jednou nebo více metodami uvnitř spravované třídy.Klíčové slovo delegate definuje typ delegáta vícesměrového vysílání s určitou signaturou metody.
Delegát může být také svázán s metodou třídy hodnoty, například statickou metodou.
Delegát má následující charakteristiky:
Dědí z třídy System::MulticastDelegate.
Má konstruktor, který přijímá dva argumenty: ukazatel na spravovanou třídu nebo hodnotu NULL (v případě vazby na statickou metodu) a plně kvalifikovanou metodu určeného typu.
Má metodu nazvanou Invoke, jejíž signatura se shoduje s deklarovanou signaturou delegáta.
Dojde-li k zavolání delegáta, jsou jeho funkce volány v pořadí, v němž byly připojeny.
Návratovou hodnotou delegáta je návratová hodnota naposled připojené členské funkce.
Delegáty nelze přetížit.
Delegáti mohou být vázaní či nevázaní.
Při tvorbě instance vázaného delegáta je prvním argumentem odkaz na objekt.Druhým argumentem tvorby instance delegáta je buď adresa metody objektu spravované třídy, nebo ukazatel na metodu typu hodnoty.Druhý argument tvorby instance delegáta musí uvést název metody úplnou syntaxí rozsahu třídy a použít operátor address-of.
Tvoříte-li instanci nevázaného delegáta, je prvním argumentem buď adresa metody objektu spravované třídy, nebo ukazatel na metodu typu hodnoty.Argument musí uvést název metody úplnou syntaxí rozsahu třídy a použít operátor address-of.
Při tvorbě delegáta na statickou nebo globální funkci je vyžadován pouze jeden parametr: samotná funkce (volitelně také její adresa).
Další informace o delegátech naleznete v tématech
Požadavky
Možnost kompilátoru: /clr
Příklady
Příklad
Následující příklad ukazuje, jak deklarovat, inicializovat a vyvolat delegáty.
// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;
// declare a delegate
public delegate void MyDel(int i);
ref class A {
public:
void func1(int i) {
Console::WriteLine("in func1 {0}", i);
}
void func2(int i) {
Console::WriteLine("in func2 {0}", i);
}
static void func3(int i) {
Console::WriteLine("in static func3 {0}", i);
}
};
int main () {
A ^ a = gcnew A;
// declare a delegate instance
MyDel^ DelInst;
// test if delegate is initialized
if (DelInst)
DelInst(7);
// assigning to delegate
DelInst = gcnew MyDel(a, &A::func1);
// invoke delegate
if (DelInst)
DelInst(8);
// add a function
DelInst += gcnew MyDel(a, &A::func2);
DelInst(9);
// remove a function
DelInst -= gcnew MyDel(a, &A::func1);
// invoke delegate with Invoke
DelInst->Invoke(10);
// make delegate to static function
MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
StaticDelInst(11);
}
Výsledek