¿Hay algún movimiento independiente de la plataforma (no CLI) para que LINQ funcione con C ++ de alguna manera?
Me refiero a que una gran parte de los frameworks de servidores de todo el mundo se ejecutan en versiones de UNIX y tener acceso a LINQ para C ++ en UNIX probablemente haría feliz a mucha gente.
Respuestas:
Linq ++ de Hong Jiang parece un buen comienzo. Su sintaxis es mucho más cercana a Linq que a CLinq. Linq de pfultz2 también parece interesante, pero necesita un compilador C ++ 11.
fuente
Esta es mi solución de la biblioteca de plantilla C ++ LINQ.
El código fuente está aquí: Boolinq
Hay muchas pruebas en cada función.
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 :)
fuente
Q_FOREACH
. Probablemente debido aQ_FOREACH
su eliminación.#define foreach for_each
luego incluir:#undef foreach
y luego incluir encabezados Qt.Microsoft acaba de anunciar que ha creado LINQ para C y C ++. Sin embargo, aún no está disponible.
Actualización 11/06/2012:
Microsoft Open Technologies, Inc. ha lanzado y de código abierto (Apache License 2.0) una serie de bibliotecas relacionadas, incluida una implementación LINQ (Ix ++), y su nueva biblioteca Reactive Extensions (Rx ++).
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 "." El operador es que no se puede sobrecargar en C ++, lo que dificulta la ampliación de estas bibliotecas con funciones de mi propio diseño. Para mi esto es importante. CppLinq se basa en el operador >> que se puede sobrecargar, por lo que CppLinq se puede hacer extensible.
fuente
Puede echar un vistazo a PSade.Oven , una biblioteca fuertemente reforzada que trabaja en rangos STL y que proporciona muchas funciones similares a LINQ.
fuente
He escrito una pequeña biblioteca cppLinq que reimplementa IEnumerable <> y sus operadores LINQ. Es solo un experimento; por ahora, solo funciona en Windows (las corrutinas se implementan con fibras Win32) y solo se compila con Dev Preview de VS11 (hace un uso intensivo de expresiones lambda :-)).
Permite escribir código como este:
auto source = IEnumerable<int>::Range(0, 10); auto it = source->Where([](int val) { return ((val % 2) == 0); }) ->Select<double>([](int val) -> double { return (val * val); })); foreach<double>(it, [](double& val){ printf("%.2f\n", val); });
fuente
shared_ptr
saunique_ptr
s, ya que la última se puede convertir a la primera, pero no al revés. Además, estilo cosita, no necesitas el-> double
tipo de retorno. Deja que las conversiones implícitas hagan su trabajo.Aquí hay otra alternativa que es simplemente una envoltura alrededor de los algoritmos boost y stl, y por lo tanto, obtiene la mayoría de los beneficios de rendimiento de esas implementaciones.
Funciona así:
std::vector<int> 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<std::vector<int>>();
Tenga en cuenta que algunos métodos devuelven un proxy para rangos vacíos, por ejemplo
std::vector<int> xs; auto max = from(xs) .select([](int x){return x*x;}) .where([](int x){return x > 16;}) .max() .value_or(default_max_value);
Los comentarios son bienvenidos.
fuente
En realidad, si solo desea usar Linq para la comprensión de listas, puede usar esta biblioteca de Linq . Requiere C ++ 11 (aunque funcionará en MSVC 2010) y Boost. Con la biblioteca puede escribir consultas linq como esta:
struct student_t { std::string last_name; std::vector<int> scores; }; std::vector<student_t> 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á como resultado:
Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91
fuente
C ++ 0x, o como 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 .fuente
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 funciones como "consulta diferida", "basada en pila" (utilice el operador nuevo lo menos posible), "copia semántica" (para que pueda iterar una consulta varios días después de realizar una copia de seguridad), etc.
También admite docenas de funciones, entre las que se incluyen "desde, seleccionar, dónde, emitir, rango, todos, cualquiera, emitir, promedio, contener, contar, primero, último, cabeza, cola, groupBy, takeUntil, skipUntil, max, min, reducir, único, ordenado, aleatorio, intersección, unión ".
Creo que mi código es lo suficientemente simple como para que cualquiera pueda entenderlo y extenderlo.
fuente
No creo que C ++ tenga el azúcar de compilación para manejar cosas como expresiones lambda, así que no, eso no va a suceder.
fuente
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
seleccionar a los cinco adultos más jóvenes de un std :: vector <Person> y devolverlos en orden alfabético. Entonces diría que C ++ es adecuado para la tarea ...Expression<T>
en la documentación de C #.