Narzędzia użytkownika

Narzędzia witryny


bind

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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'' ​''​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=====
bind.txt · ostatnio zmienione: 2008/04/14 09:00 przez maciejp