Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
lambda [2008/04/16 22:33] przemo86 |
lambda [2008/04/16 23:27] (aktualna) przemo86 |
||
|---|---|---|---|
| Linia 18: | Linia 18: | ||
| ===== Przykłady ===== | ===== Przykłady ===== | ||
| Poniższe przykłady pokazują (w niewielkim stopniu) możliwości tych wyrażeń. Należy w tym miejscu zwrócić uwagę, że często wyrażenia lambda wykorzystują mechanizmy pomocnicze zdefiniowane w innych bibliotekach których nagłówki należy dołączyć. Standardowo dołączamy bibliotekę boost\lambda\lambda.hpp. W przykładach będą pokazane nagłówki które dodatkowo należy dołączyć by kod się skompilował. | Poniższe przykłady pokazują (w niewielkim stopniu) możliwości tych wyrażeń. Należy w tym miejscu zwrócić uwagę, że często wyrażenia lambda wykorzystują mechanizmy pomocnicze zdefiniowane w innych bibliotekach których nagłówki należy dołączyć. Standardowo dołączamy bibliotekę boost\lambda\lambda.hpp. W przykładach będą pokazane nagłówki które dodatkowo należy dołączyć by kod się skompilował. | ||
| + | |||
| ==== Pierwszy rzut oka na boost::lambda ==== | ==== Pierwszy rzut oka na boost::lambda ==== | ||
| Linia 34: | Linia 35: | ||
| </code> | </code> | ||
| - | Kod ten możemy odczytać jako: Wywołaj w tym konkretnym miejscu funkcję którą wyprowadzi na standardowe wyjście argumenty w kolejności 2,1,3. | + | Kod ten możemy odczytać jako: Wywołaj w tym konkretnym miejscu funkcję która wyprowadzi na standardowe wyjście argumenty w kolejności 2,1,3. |
| ==== Elementy kontenerów ==== | ==== Elementy kontenerów ==== | ||
| Linia 50: | Linia 52: | ||
| void funkcja_klasy (const float i) const | void funkcja_klasy (const float i) const | ||
| { | { | ||
| - | std::cout << "\nvoid example::funkcja_klasy : " << i; | + | std::cout << "\nvoid Example::funkcja_klasy : " << i; |
| } | } | ||
| Linia 132: | Linia 134: | ||
| </code> | </code> | ||
| + | |||
| Linia 168: | Linia 171: | ||
| _1, | _1, | ||
| case_statement<0> | case_statement<0> | ||
| - | (var(std::cout) << constant("Wybrales 0 \n")), | + | (std::cout << constant("Wybrales 0 \n")), |
| case_statement<1> | case_statement<1> | ||
| - | (var(std::cout) << constant("Wybrales 1 \n")), | + | (std::cout << constant("Wybrales 1 \n")), |
| default_statement | default_statement | ||
| - | (var(std::cout) << constant("Nie mam pojecia co wybrales!\n"))) | + | (std::cout << constant("Nie mam pojecia co wybrales!\n"))) |
| ) ((make_const(666))); | ) ((make_const(666))); | ||
| </code> | </code> | ||
| + | |||
| + | Użycie (make_const(666)) jest konieczne. Szablon tej funkcji jest następujący i jest zdefiniowany w bibliotece boost: | ||
| + | <code cpp> | ||
| + | template <class T> inline const T& make_const(const T& t) { return t; } | ||
| + | </code> | ||
| + | Przekazanie samego 666 mogłoby sprowokować błąd ponieważ 666 jest typu int i nie może mieć kwalifikatora const. Szablon natomiast potrzebuje const &. | ||
| === Petla while === | === Petla while === | ||
| Linia 229: | Linia 238: | ||
| )(make_const (4)); | )(make_const (4)); | ||
| </code> | </code> | ||
| + | |||
| + | Ponieważ powyższe wyrażenie jest wyrażeniem lambda więc aby ono zrozumiało zmienne zewnętrzne należy je stworzyć jego elementem. Taką konwersje tworzy funkcja var(). | ||
| Linia 270: | Linia 281: | ||
| </code> | </code> | ||
| + | ===== Zakończenie i plik z przykładami ===== | ||
| + | Wyrażenia lambda to przydatne konstrukcje które nie raz mogą zaoszczędzić czas, zmniejszyć ilość kodu czy zajętą przez program pamięć. Mankamentem jest składnia wyrażeń której należy się po prostu nauczyć i przećwiczyć na wielu przykładach. | ||
| + | Powyższe przykłady można wypróbować pobierając plik: | ||
| + | {{boost_lambda.cpp|}} | ||