2008-10-24 12 views
69

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

Me refiero a una gran parte de los marcos de servidores de todo el mundo ejecutados en los sabores de UNIX y tener acceso a LINQ para C++ en UNIX probablemente haría felices a mucha gente.

+0

¿Se refiere a la mónada (IEnumerable <> y al conjunto de métodos de extensión)? ¿Te refieres al aspecto del idioma? ¿Te refieres a LINQ-to-SQL? – yfeldblum

+0

Bueno, la parte de LINQ-SQL es la parte que realmente quisiera, pero eso depende del lenguaje de LINQ y de las mónadas. –

Respuesta

-1

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

+5

C++ 0X tiene lambda, por lo que debería ser teóricamente posible, pero sí, no es una tarea fácil. –

+0

Ahora que lo mencionó y me hizo pensar, otra opción que puedo imaginar es ir a la ruta QT, y usar un precompilador para agregar el azúcar sintáctico a C++, que podría ser una buena alternativa –

+7

La Biblioteca Boost.Phoenix también agrega Lambdas a C++ sin ningún truco previo al compilador. Ver http://tinyurl.com/d4y9se [boost.org] ¡Por supuesto, con C++ 0x muchas de estas cosas se vuelven más fáciles! Un buen artículo sobre cómo hacer LINQ con C++ 0x http://tinyurl.com/d9zlsc [blogspot.com] –

2

C++ 0x, o como quiera 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 Google reveló esto, CLinq.

7

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.

+0

bastante interesante, voy a echarle un vistazo cuando tenga oportunidad, ¡gracias! –

32

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

+1

Muy interesante trabajo allí –

+1

Agradable. La versión de C++ 11 parece muy interesante, incluso si su ejemplo de comprensión cruda debería haber usado Phoenix para evitar el "código repetitivo". – KitsuneYMG

+0

hmm No los veo soportando bases de datos SQL. – Arne

12

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 ello ahora mismo.

¿Algún comentario?
¿Pueden ser consejos?

ACTUALIZACIÓN: Proyecto trasladado a https://github.com/k06a/boolinq y ahora tienen la versión 2.0 con sólo 700 líneas de código fuente :)

+0

No pude usar boolinq con Qt 5.9.1 debido a errores de compilación con respecto a 'Q_FOREACH'. Probablemente debido a que 'Q_FOREACH' se ha eliminado. –

+0

@ NikolaMalešević puedes intentar definir justo antes de incluir boolinq.h: '#define foreach for_each' luego incluir:' #undef foreach' y luego incluir encabezados Qt. – k06a

7

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 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<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); 
}); 
+7

Ciegamente convertir C# a C++ no va a hacer ningún bien a nadie. ¿Por qué necesitas las interfaces? Si te deshaces de ellos, te deshaces de todas esas asignaciones inútiles y la sintaxis del poiner también. Y si no puede, al menos cambie el 'shared_ptr's a' unique_ptr's, ya que este último se puede convertir al anterior, pero no al revés. Además, estilo cosita, no necesitas el tipo de retorno '-> doble'. Solo deja que las conversiones implícitas hagan su trabajo. – Xeo

+2

Gracias por su comentario. Sí, la lambda en la muestra anterior podría mejorarse un poco, pero es solo un detalle. Sin embargo, no estoy seguro de lo que puedo hacer con shared_ptrs y punteros. La idea era implementar bloques de iteradores con corutinas, exactamente cómo se implementan en C#, para proporcionar evaluación perezosa y canalizaciones de datos. En la fuente, podemos tener algo que "genere" datos de un contenedor STL, por ejemplo, pero luego tenemos un conjunto de componentes que deben comportarse como IEnumerators, generando datos de co-rutinas. ¿Qué interfaz tendrías en mente para una versión C++ de LINQ? –

+5

Un enfoque estático basado en una plantilla de expresión es lo que tenía en mente. [Lea sobre esto.] (Http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template) – Xeo

3

En realidad, si lo que desea es utilizar LINQ para la comprensión de lista, puede utilizar esta biblioteca Linq. Requiere C++ 11 (aunque funcionará en MSVC 2010) y Boost. Con la biblioteca puede escribir consultas LINQ como esto:

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); 
} 

Cuál sería:

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

Microsoft tiene just announced que han construido LINQ para C y C++. Aún no está disponible, sin embargo.

Actualización 11/06/2012:

Microsoft Open Technologies, Inc. tiene ahora released y open-sourced (Apache License 2.0) una serie de bibliotecas relacionadas, incluyendo una aplicación de LINQ (Ix ++), y es nueva Biblioteca de extensiones reactivas (Rx ++).

2

Aquí hay otra alternative que es simplemente una envoltura alrededor de los algoritmos boost y stl, y así 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 de vacío, 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.

+0

Muy bien hecho, me gusta. –

2

Aquí es mi IMPLEMENTACIÓN DE C++ - LINQ con C++ 11 (en chino):

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

Es compatible con las funciones como "consulta diferida", "apilar basada" (operador de un uso nuevo tan poco como sea posible), "copiar semántica" (para que pueda iterar una consulta multitime después de la copia de seguridad), y así sucesivamente.

También admite docenas de funciones que incluyen "desde, seleccione, donde, emitir, rango, todo, cualquier, cast, promedio, contener, contar, primero, último, cabeza, cola, grupoBy, takeUntil, skipUntil, max, min, reduce, unique, sort, random, intersect, _union ".

Creo que mi código es lo suficientemente simple de entender y extender por cualquiera.

9

http://cpplinq.codeplex.com/ es una muy buena implementación.
Del autor:
La motivación para CppLinq es que tanto boolinq como Native-RX parecen basarse 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.

Cuestiones relacionadas