Delegáty, události a lambda výrazy ve WinRT

17. 10. 2011 0:24 zboj

Jak známo, Metro aplikace ve Windows 8 staví na tzv. Windows Runtime, což je náhrada za Win32 API. WinRT je implementované v C++ a preview Visual C++ obsahuje překladač pro C++/CX, což je C++ rozšířené o „Component Extensions“, tedy rozhraní pro práci s novější verzí COM objektů (rozšířená syntax je značně podobná C++/CLI). Nad rámec C++ lze u tříd definovat delegáty (delegate) a události (event). Protože Visual C++ zároveň implementuje značnou část nového standardu C++11 včetně lambda výrazů, zde je ukázka, jak definovat obsluhu událostí s jejich pomocí (ve Visual C++ 2010 to možné není).

Delegát je v podstatě typ funkce. Například pro příchozí zprávu bychom měli:

delegate void NewMessage(Message^);

Událost se definuje takto:

event NewMessage^ OnNewMessage;

Pro obsluhu události lambda výrazem je nutné vytvořit instanci delegáta:

obj->OnNewMessage += ref new NewMessage([](Message^ message) { ... });

Je zřejmé, proč nestačí pouze lambda výraz. WinRT poskytuje tzv. projekce pro další jazyky (C#, Javascript apod.) a z C++ není možné zpřístupnit nativní konstrukce (to kontroluje překladač), mezi něž bohužel lambda výrazy patří. Takto je zajištěno, že metadata komponenty (soubor s příponou winmd, který vytváří překladač) budou srozumitelná i jiným jazykům. Objekt delegáta je tak vlastně wrapper okolo lambda výrazu.

Sdílet