Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
bind [2008/04/14 08:53] maciejp |
bind [2008/04/14 08:56] maciejp |
||
---|---|---|---|
Linia 148: | Linia 148: | ||
derived! | derived! | ||
</code> | </code> | ||
+ | |||
=====Użycie zagnieżdżeń do kompozycji fukcji===== | =====Użycie zagnieżdżeń do kompozycji fukcji===== | ||
- | Część argumentów przekazywanych bind może być zagnieżdżonymi wyrażeniami boost::bind. | + | Część argumentów przekazywanych bind może być zagnieżdżonymi wyrażeniami ''boost::bind''. |
<code cpp> | <code cpp> | ||
Linia 158: | Linia 159: | ||
</code> | </code> | ||
- | Wewnętrzne wyrażenia są ewaluowane w bliżej nie okreśłonej kolejności, ale przed wywołaniem funktora zewnętzrnego boost::bind. Odnosząc się do przykładu, kiedy utworzony funktor jest wywoływany z argumentem x, w pierwszej kolejności ewalowany jest bind(g, _1)(x), dając g(x), następnie bind(f, g(x))(x), dając finalny wynik w postaci wywołania f(g(x)). | + | Wewnętrzne wyrażenia są ewaluowane w bliżej nie okreśłonej kolejności, ale przed wywołaniem funktora zewnętzrnego ''boost::bind''. Odnosząc się do przykładu, kiedy utworzony funktor jest wywoływany z argumentem ''x'', w pierwszej kolejności ewalowany jest ''bind(g, _1)(x)'', dając ''g(x)'', następnie ''bind(f, g(x))(x)'', dając finalny wynik w postaci wywołania ''f(g(x))''. |
- | Ta cecha boost::bind może być bardzo dobrze zastosowana do kompozycji funkcji. | + | Ta cecha ''boost::bind'' może być bardzo dobrze zastosowana do kompozycji funkcji. |
- | Trzeba zaznaczyć, że pierwszy argument boost::bind (opakowywany obiekt funkcyjny) nie jest ewalowany, nawet wtedy, kiedy jest to obiekt funkcyjny produkowany przez zagnieżdżone wywołanie bind lub argument w postaci symbola zastępczego. Poniższy przykład nie będzie działał tak, jakbyśmy tego oczekiwali. | + | Trzeba zaznaczyć, że pierwszy argument ''boost::bind'' (opakowywany obiekt funkcyjny) nie jest ewalowany, nawet wtedy, kiedy jest to obiekt funkcyjny produkowany przez zagnieżdżone wywołanie ''bind'' lub argument w postaci symbola zastępczego. Poniższy przykład nie będzie działał tak, jakbyśmy tego oczekiwali. |
<code cpp> | <code cpp> | ||
Linia 172: | Linia 173: | ||
</code> | </code> | ||
- | Oczekiwany efekt uzyskamy korzystając z pomocniczego obiektu funkcyjnego apply (implementacja apply w boost/bind/apply.hpp), który podajemy jako pierwszy argument boost::bind. Poprzedni przykład powinien wyglądać następująco. | + | Oczekiwany efekt uzyskamy korzystając z pomocniczego obiektu funkcyjnego ''apply'' (implementacja ''apply'' w ''boost/bind/apply.hpp''), który podajemy jako pierwszy argument ''boost::bind''. Poprzedni przykład powinien wyglądać następująco. |
<code cpp> | <code cpp> | ||
Linia 182: | Linia 183: | ||
</code> | </code> | ||
- | Używając bind można komponować funkcje korzystając naraz z boost::bind i funkcji (algorytmów) z biblioteki standardowej. | + | Używając ''bind'' można komponować funkcje korzystając naraz z ''boost::bind'' i funkcji (algorytmów) z biblioteki standardowej. |
<code cpp> | <code cpp> | ||
Linia 214: | Linia 215: | ||
</code> | </code> | ||
- | Jak widać na przykładzie łatwo można tworzyć złożone predykaty. Często trzeba się jednak często zastanowić, czy stosować bardzo złożone wyrażenia. Utrudniają one późniejszą analizę kodu, często wręcz uniemożliwiają. Warto rozważyć w takich przypadkach zdefinjowanie funktora lub operatora operator() dla klasy. | + | Jak widać na przykładzie łatwo można tworzyć złożone predykaty. Często trzeba się jednak często zastanowić, czy stosować bardzo złożone wyrażenia. Utrudniają one późniejszą analizę kodu, często wręcz uniemożliwiają. Warto rozważyć w takich przypadkach zdefinjowanie funktora lub operatora ''operator()'' dla klasy. |
=====Użycie z biblioteką Boost.Function===== | =====Użycie z biblioteką Boost.Function===== |