¿Hay una biblioteca LINQ para C ++?

¿Hay algún movimiento Agnóstico de plataforma (no CLI) para obtener LINQ para C ++ de alguna manera?

Me refiero a que una gran parte de los marcos de servidores de todo el mundo ejecutados en los sabores de UNIX y que tienen acceso a LINQ para C ++ en UNIX probablemente harían felices a muchas personas.

Linq ++ por Hong Jiang parece un buen comienzo. Su syntax está mucho más cerca de Linq que de CLinq. Linq por pfultz2 parece interesante, también, pero necesita un comstackdor C ++ 11.

Microsoft acaba de anunciar que han creado LINQ para C y C ++. Aún no está disponible, sin embargo.

Actualización 11/06/2012:

Microsoft Open Technologies, Inc. ha lanzado y ha abierto (Apache License 2.0) una serie de bibliotecas relacionadas, incluida una implementación LINQ (Ix ++), y su nueva biblioteca Reactive Extensions (Rx ++).

Esta es mi solución de plantilla C ++ LINQ library.
El código fuente está aquí: Boolinq
Hay muchas pruebas en cada característica.
Estoy trabajando en eso ahora mismo.

¿Algún comentario?
Pueden ser consejos?

ACTUALIZACIÓN: el proyecto se movió a https://github.com/k06a/boolinq y ahora tiene la versión 2.0 con solo 700 líneas de código fuente 🙂

http://cpplinq.codeplex.com/ es una muy buena implementación.
Del autor:
La motivación de CppLinq es que tanto boolinq como Native-RX parecen estar basados ​​en el operador “.” para componer funciones de lista. El problema es que el “.” operador es que no se puede sobrecargar en C ++, lo que dificulta ampliar estas bibliotecas con funciones de mi propio diseño. Para mí, esto es importante. CppLinq se basa en operador >> que es sobrecargable, por lo tanto, CppLinq puede hacerse extensible.

Puede echar un vistazo a PSade.Oven , una biblioteca fuertemente reforzada que trabaja en rangos de STL y que proporciona muchas funciones similares a LINQ.

He escrito una pequeña biblioteca cppLinq que vuelve a implementar IEnumerable <> y sus operadores LINQ. Es solo un experimento; por ahora, solo funciona en Windows (las corutinas se implementan con fibras Win32) y solo se crea con la Vista previa de desarrollo de VS11 (hace un uso intensivo de las expresiones lambda :-)).

Permite escribir código como este:

 auto source = IEnumerable::Range(0, 10); auto it = source->Where([](int val) { return ((val % 2) == 0); }) ->Select([](int val) -> double { return (val * val); })); foreach(it, [](double& val){ printf("%.2f\n", val); }); 

Aquí hay otra alternativa que es simplemente una envoltura alrededor de los algoritmos stl y boost, y así obtiene la mayoría de los beneficios de rendimiento de esas implementaciones.

Funciona así:

 std::vector xs; auto count = from(xs) .select([](int x){return x*x;}) .where([](int x){return x > 16;}) .count(); auto xs2 = from(xs) .select([](int x){return x*x;}) .to>(); 

Tenga en cuenta que algunos métodos devuelven un proxy para intervalos vacíos, por ejemplo

 std::vector xs; auto max = from(xs) .select([](int x){return x*x;}) .where([](int x){return x > 16;}) .max() .value_or(default_max_value); 

Comentarios son bienvenidos.

En realidad, si solo quiere usar Linq para la comprensión de la lista, puede usar esta biblioteca de Linq . Requiere C ++ 11 (aunque funcionará en MSVC 2010) y Boost. Con la biblioteca puede escribir consultas de linq como esta:

 struct student_t { std::string last_name; std::vector scores; }; std::vector students = { {"Omelchenko", {97, 72, 81, 60}}, {"O'Donnell", {75, 84, 91, 39}}, {"Mortensen", {88, 94, 65, 85}}, {"Garcia", {97, 89, 85, 82}}, {"Beebe", {35, 72, 91, 70}} }; auto scores = LINQ(from(student, students) from(score, student.scores) where(score > 90) select(std::make_pair(student.last_name, score))); for (auto x : scores) { printf("%s score: %i\n", x.first.c_str(), x.second); } 

Que dará salida:

 Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91 

C ++ 0x, o lo que sea que termine llamándose, tiene una nueva palabra clave llamada auto que permite la inferencia de tipos. Y sí, habrá lambda para C ++. Además, una búsqueda rápida en Google reveló esto, CLinq .

Aquí está mi implementación de c ++ – linq con c ++ 11 (en chino):

http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html

Admite características como “consulta diferida”, “basada en stack” (utilice el operador nuevo lo menos posible), “copia semántica” (para que pueda repetir una consulta multimédica después de la copia de seguridad), y así sucesivamente.

También es compatible con docenas de funciones que incluyen “desde, seleccionar, dónde, emitir, rango, todo, cualquier, cast, promedio, contener, contar, primero, último, encabezado, cola, grupoBy, takeUntil, skipUntil, max, min, reducir, unique, sort, random, intersect, _union “.

Creo que mi código es lo suficientemente simple como para entenderlo y extenderlo por cualquiera.

No creo que C ++ tenga el comstackdor de azúcar para manejar cosas como expresiones lambda, así que no, eso no va a suceder.