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
Previous revision
bind [2008/04/14 08:56]
maciejp
bind [2008/04/14 09:00] (aktualna)
maciejp
Linia 216: Linia 216:
  
 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=====
  
-Funktor zwracany przez boost::bind można przypisać do obiektu funkcyjnego boos::​function. W ten sposób można między innymi przechowywć wcześniej utworzone fukntory jako zmienne i pola klasy albo przekazywać je jako argument do konstruktorów lub funkcji. Przypisania możemy dokonać wykłym operatorem =.+Funktor zwracany przez ''​boost::bind'' ​można przypisać do obiektu funkcyjnego ​''​boos::​function''​. W ten sposób można między innymi przechowywć wcześniej utworzone fukntory jako zmienne i pola klasy albo przekazywać je jako argument do konstruktorów lub funkcji. Przypisania możemy dokonać wykłym operatorem ​''​=''​.
  
 <code cpp> <code cpp>
Linia 227: Linia 228:
 </​code>​ </​code>​
  
-Warunkiem poprawnej kompilacji jest dokładne określenie typu szablonu obiektu function (zasada działania boost::​function wykracza poza ten artykuł).+Warunkiem poprawnej kompilacji jest dokładne określenie typu szablonu obiektu function (zasada działania ​''​boost::​function'' ​wykracza poza ten artykuł). 
  
 =====Przeciążone operatory===== =====Przeciążone operatory=====
  
-Przeciązone operatory dla boost::bind pojawiły się w Boost 1.33+Przeciązone operatory dla ''​boost::bind'' ​pojawiły się w Boost 1.33
  
-Obiekty funkcyjne produkowane przez boost::bind przeciążają logiczny operator przecenia ! oraz operatory relacji ==, !=, <, <=, >, >=.+Obiekty funkcyjne produkowane przez ''​boost::bind'' ​przeciążają logiczny operator przecenia ​''​!'' ​oraz operatory relacji ​''​==''​''​!=''​''​<''​''​<=''​''​>''​''​>=''​.
  
 <​code>​ <​code>​
Linia 245: Linia 247:
 </​code>​ </​code>​
  
-gdzie logical_not jest funktorem przyjmującym jeden argument x i zwracający !x.+gdzie ''​logical_not'' ​jest funktorem przyjmującym jeden argument ​''​x'' ​i zwracający ​''​!x''​.
  
 <code cpp> <code cpp>
 bind(f, ...) op x bind(f, ...) op x
 </​code>​ </​code>​
-op jest operatorem relacji, wyrażniu temu odpowiada+''​op'' ​jest operatorem relacji, wyrażniu temu odpowiada
  
 <code cpp> <code cpp>
 bind(relation(),​ bind(f, ...), x) bind(relation(),​ bind(f, ...), x)
 </​code>​ </​code>​
-gdzie relation jest funktorem przyjmującym dwa argumenty a i b zwracającym a op b.+gdzie ''​relation'' ​jest funktorem przyjmującym dwa argumenty ​''​a'' ​''​b''​ oraz zwracającym ​''​a op b''​.
  
-Przeciążenie tych operatorów umożliwia na konwencjonalne negowanie wyniku boost::​bind:​+Przeciążenie tych operatorów umożliwia na konwencjonalne negowanie wyniku ​''​boost::bind''​:
  
 <code cpp> <code cpp>
Linia 263: Linia 265:
 </​code>​ </​code>​
  
-oraz na porównywanie wyników boost::bind z wartościami:​+oraz na porównywanie wyników ​''​boost::bind'' ​z wartościami:​
  
 <code cpp> <code cpp>
Linia 275: Linia 277:
 </​code>​ </​code>​
  
-albo z innym wyrażeniem boost::​bind:​+albo z innym wyrażeniem ​''​boost::bind''​:
  
 <code cpp> <code cpp>
 std::​sort(first,​ last, bind(&​X::​name,​ _1) < bind(&​X::​name,​ _2)); std::​sort(first,​ last, bind(&​X::​name,​ _1) < bind(&​X::​name,​ _2));
 </​code>​ </​code>​
 +
  
  
Linia 285: Linia 288:
 =====Inny przykład użycia===== =====Inny przykład użycia=====
  
-boost::bind umożliwia w przeciwnieństwie do funkcji z biblioteki standardowej (służących do tworzenia adpterów funkcji) bardzo elastyczną pracę z kodem.+''​boost::bind'' ​umożliwia w przeciwnieństwie do funkcji z biblioteki standardowej (służących do tworzenia adpterów funkcji) bardzo elastyczną pracę z kodem.
  
 <code cpp> <code cpp>
Linia 345: Linia 348:
 </​code>​ </​code>​
  
-Użycie funkcji standardowych (std::​mem_fun_ref i std::​mem_fun) zmusza do zmian także pętli for_each po każdej modyfikacji typu przechowywanego przez wektor, a nawet uniemożliwia dalszą pracę (brak obsługi w przypadku użycia sprytnych wskaźników).+Użycie funkcji standardowych (''​std::​mem_fun_ref'' ​''​std::​mem_fun''​) zmusza do zmian także pętli ​''​for_each'' ​po każdej modyfikacji typu przechowywanego przez wektor, a nawet uniemożliwia dalszą pracę (brak obsługi w przypadku użycia sprytnych wskaźników).\\ 
 +\\ 
 +\\ 
 + --- //​[[mplachta@stud.elka.pw.edu.pl|Maciej Płachta H1ISI]]//
bind.1208156166.txt.gz · ostatnio zmienione: 2008/04/14 08:56 przez maciejp