Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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++