Delegacyjny system zdarzeń w oparciu o wyrażenia Lambda (C++)
Kiedyś, dawno temu napisałem notkę o C++0x, i wsparciu Visual Studio 2010 dla szeregu uaktualnień języka i standardowych bibliotek opisanych raportem technicznym (TR1).
Przykład tam opisany to swoiste myślenie życzeniowe. Ze względu na wykorzystanie surowego C w API systemowym (Win32) niewykonalne wtedy, teraz i pewnie nigdy.
Chyba, że koledzy z Redmond zabiją kiedyś Win32 i zastąpią czymś nowym. To by dopiero było... :)
No ale ja nie o tym. W tzw. między czasie potestowałem sobie konstrukcję systemu zdarzeniowego opartego właśnie o wzorzec delegacyjny i z wykorzystaniem wyrażeń Lambda z C++0x.
Zadziałało i wyglada przyznam, całkiem csharpowo. Oto kawałek kodu, który dodaje mi procedurę obsługującą klawiaturę już w właściwej aplikacji:
Wygląda sympatycznie i swojsko jeśli ktoś wraca do C++ z wieloletnimi przyzwyczajeniami z C# czy Java.
Dla kompletu istotny fragment definicji klasy okna:
Już jest widoczne, że każde zdarzenie to tak naprawdę wektor wyrażeń lambda z określonymi parametrami do szablonu zgodnymi z parametrami wejściowymi jakie chcielibyśmy przekazać do funkcji, która to zdarzenie obsługuje.
W moim przypadku założyłem sobie, że zawsze idzie uniwersalny wskaźnik void* (dosyć surowo) a dalej parametry określonych typów, które miały sens przy deklaracji poszczególnych zdarzeń.
Aby w pełni zrozumieć ten przykład brakuje jeszcze implementacji metod wirtualnych on_*
Oto jedna z nich, dla wykorzystanego powyżej zdarzenia key_down:
W przypadku implementacji pod Windows nie pozostaje nic innego jak tylko w procedurze WNDPROC odpowiednio przekierować odwołanie z komunikatu WM_KEYDOWN:
Aktualnie testuję w praktyce, taki system - właśnie na okienkach. Otwartą kwestią bowiem jest wydajność.
Jeśli ten przykład nie jest dla was jasny to polecam poniższą lekturę:
https://msdn.microsoft.com/en-us/library/169de7b0.aspx - Opis elementów standardowej biblioteki opisanych w nagłówku <functional>
https://channel9.msdn.com/shows/c9-goingnative - Seria webcastów (nowa) na Channel9, skupiona wokół C++ na platformie Windows
https://stackoverflow.com/questions/89488/comparing-stdtr1function-objects - dyskusja i alternatywne pomysły na delegacyjny system zdarzeń w C++