2011-06-27 8 views
5

Dado que las expresiones lambda requieren la versión GCC> 4.4: ¿cuál es la forma más elegante o más rápida (aunque no demasiado "sucia") de portar código que contiene un par de expresiones lambda con variables de referencia código pre-C++ 0x?Transferencia elegante de expresiones lambda en C++

¿Se puede hacer esto de forma semiautomática utilizando plantillas/macros?

Respuesta

6

Tal vez deberías echar un vistazo a boost::lambda. Esto debería hacer lo que estás buscando.

+0

+1. Usé boost :: lambda un poco, pero me pareció bastante incómodo en algunos aspectos. No puedes usar métodos directamente en los lambda args. Por ejemplo, no puede hacer 'sort (v.begin(), v.end(), _1.size() <_2.size())' pero puede hacer 'sort (v.begin(), v. end(), f (_1)

+1

A partir de Boost 1.47 (que actualmente se encuentra en fase beta y se lanzará en las próximas dos semanas), Boost.Lambda está oficialmente en desuso y reemplazado por [Boost.Phoenix v3] (http://beta.boost.org/libs/phoenix/index.html), por lo que Boost.Phoenix es una mejor recomendación en este momento. – ildjarn

+1

@ Aaron: Boost.Phoenix contiene [envoltorios para todos los contenedores y algoritmos de bibliotecas estándar] (http://beta.boost.org/libs/phoenix/doc/html/phoenix/modules/stl.html), por lo que se parece a 'sort (v.begin, v.end(), size (_1) ildjarn

2

(Negación:. Estoy ligarse a mi propio sitio)

Hace aproximadamente un año, puse un par de macros útiles en un a blog post of mine. No sé qué tan portátil es, y es bastante limitado. Pero para expresiones simples, funciona bien.

Tenga en cuenta que no he encontrado mucho uso para él mismo, por lo que no puede ser tan bueno :-)

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