2011-06-27 24 views
5

Ponieważ wyrażenia lambda wymagają wersji GCC> 4.4: jaki jest najbardziej elegancki lub najszybszy (ale nie zbyt "brudny") sposób przenoszenia kodu zawierającego kilka wyrażeń lambda ze zmiennymi odniesionymi do kod pre-C++ 0x?Eleganckie portowanie wyrażeń lambda w C++

Czy można to zrobić w sposób półautomatyczny za pomocą szablonów/makr?

Odpowiedz

6

Może powinieneś rzucić okiem na boost::lambda. Powinno to zrobić to, czego szukasz.

+0

+1. Użyłem boost :: lambda trochę, ale w pewnym sensie uznałem to za dość niewygodne. Nie można bezpośrednio używać metod na argonach lambda. Na przykład nie możesz zrobić 'sort (v.begin(), v.end(), _1.size() <_2.size())' ale możesz zrobić 'sort (v.begin(), v. end(), f (_1)

+1

Od wersji Boost 1.47 (która jest obecnie w wersji beta i zostanie wydana w ciągu najbliższych kilku tygodni), Boost.Lambda jest oficjalnie przestarzała i zastąpiona przez [Boost.Phoenix v3] (http: // /beta.boost.org/libs/phoenix/index.html), więc Boost.Phoenix jest lepszą rekomendacją w tym momencie. – ildjarn

+1

@Aaron: Boost.Phoenix zawiera leniwy [opakowania do wszystkich standardowych kontenerów bibliotecznych i algorytmów] (http://beta.boost.org/libs/phoenix/doc/html/phoenix/modules/stl.html), więc wyglądają jak "sort (v.begin, v.end(), size (_1) ildjarn

2

(Zastrzeżenie:. Mam link do własnej strony)

około rok temu, umieścić kilka przydatnych makr na a blog post of mine. Nie wiem, jak to jest przenośne i jest dość ograniczone. Ale dla prostych wyrażeń działa dobrze.

Zauważ, że nie znalazłem wiele wykorzystania dla niego samego siebie, więc to nie może być aż tak dobry :-)

sort(vs.begin(), vs.end(), 
YALM(bool,vector<int>&,vector<int>&,return l.size() < r.size() ) 
); 
Powiązane problemy