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.
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 203×
Přečteno 25 362×
Přečteno 23 796×
Přečteno 20 178×
Přečteno 17 875×