Gibt es plattformunabhängige (nicht CLI) Bewegungen, um LINQ in irgendeiner Weise für C ++ zum Laufen zu bringen?
Ich meine, ein großer Teil der Server-Frameworks auf der ganzen Welt wird mit UNIX-Varianten ausgeführt, und der Zugriff auf LINQ für C ++ unter UNIX würde wahrscheinlich viele Menschen glücklich machen!
Antworten:
Linq ++ von Hong Jiang scheint ein guter Anfang zu sein. Die Syntax ist Linq viel näher als die von CLinq. Linq von pfultz2 sieht ebenfalls interessant aus, benötigt jedoch einen C ++ 11-Compiler.
quelle
Dies ist meine Lösung der Vorlage C ++ LINQ Bibliothek.
Der Quellcode ist hier: Boolinq Zu
jeder Funktion gibt es viele Tests.
Ich arbeite gerade daran.
Irgendwelche Kommentare?
Kann Ratschläge sein?
UPDATE: Das Projekt wurde nach https://github.com/k06a/boolinq verschoben und hat jetzt Version 2.0 mit nur 700 Zeilen Quellcode :)
quelle
Q_FOREACH
. Wahrscheinlich aufgrund desQ_FOREACH
Auslaufens.#define foreach for_each
dann nach include: zu definieren#undef foreach
und dann Qt-Header einzuschließen .Microsoft hat gerade bekannt gegeben, dass sie LINQ für C und C ++ erstellt haben. Noch nicht verfügbar.
Update 11/06/2012:
Microsoft Open Technologies, Inc. hat jetzt eine Reihe verwandter Bibliotheken veröffentlicht und als Open-Source- Version (Apache License 2.0) bereitgestellt, darunter eine LINQ-Implementierung (Ix ++) und die neue Bibliothek Reactive Extensions (Rx ++).
quelle
http://cpplinq.codeplex.com/ ist eine sehr gute Implementierung.
Vom Autor:
Die Motivation für CppLinq ist, dass sowohl Boolinq als auch Native-RX auf dem Operator "zu basieren scheinen". Listenfunktionen zusammenstellen. Das Problem ist, dass das "." Operator ist, dass es in C ++ nicht überladen werden kann, was es schwierig macht, diese Bibliotheken mit Funktionen meines eigenen Designs zu erweitern. Für mich ist das wichtig. CppLinq basiert auf dem Operator >>, der überladbar ist, sodass CppLinq erweiterbar gemacht werden kann.
quelle
Sie können sich PSade.Oven ansehen , eine stark verbesserte Bibliothek, die an STL-Bereichen arbeitet und viele LINQ-ähnliche Funktionen bietet.
quelle
Ich habe eine kleine Bibliothek cppLinq geschrieben , die IEnumerable <> und seine LINQ-Operatoren neu implementiert. Es ist nur ein Experiment; Derzeit funktioniert es nur unter Windows (Coroutinen sind mit Win32-Fasern implementiert) und wird nur mit der Dev Preview von VS11 erstellt (Lambda-Ausdrücke werden häufig verwendet :-)).
Es erlaubt, Code wie folgt zu schreiben:
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); });
quelle
shared_ptr
s aufunique_ptr
s um, da das letztere in das erstere konvertiert werden kann, aber nicht umgekehrt. Außerdem benötigen Sie den-> double
Rückgabetyp nicht. Lassen Sie einfach die impliziten Konvertierungen ihren Job machen.Hier ist eine weitere Alternative , bei der es sich lediglich um einen Wrapper für Boost- und STL-Algorithmen handelt. Auf diese Weise erhalten Sie die meisten Leistungsvorteile dieser Implementierungen.
Es funktioniert so:
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>>();
Beachten Sie, dass einige Methoden einen Proxy für leere Bereiche zurückgeben, z
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);
Feedback ist willkommen.
quelle
Wenn Sie Linq nur zum Verständnis der Liste verwenden möchten, können Sie diese Linq- Bibliothek verwenden. Es erfordert C ++ 11 (es wird jedoch in MSVC 2010 funktionieren) und Boost. Mit der Bibliothek können Sie Linq-Abfragen wie folgt schreiben:
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); }
Welches wird ausgegeben:
Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91
quelle
C ++ 0x oder was auch immer es aufgerufen wird, hat ein neues Schlüsselwort,
auto
das Typinferenz ermöglicht. Und ja, es wird Lambda für C ++ geben. Auch eine schnelle Google- Suche ergab dies, CLinq .quelle
Hier ist meine Implementierung von c ++ - linq mit c ++ 11 (auf Chinesisch):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
Es unterstützt Funktionen wie "verzögerte Abfrage", "stapelbasiert" (verwenden Sie den neuen Operator so wenig wie möglich neu), "Semantik kopieren" (damit Sie eine Abfrage nach dem Sichern multitär iterieren können) und so weiter.
Es unterstützt auch Dutzende von Funktionen, einschließlich "von, auswählen, wo, Besetzung, Reichweite, alle, beliebig, Besetzung, Durchschnitt, enthalten, zählen, zuerst, zuletzt, Kopf, Schwanz, groupBy, takeUntil, skipUntil, max, min, reduzieren, einzigartig, sortieren, zufällig, schneiden, _union ".
Ich denke, mein Code ist einfach genug, um von jedem selbst verstanden und erweitert zu werden.
quelle
Ich glaube nicht, dass C ++ den Compilerzucker hat, um Dinge wie Lambda-Ausdrücke zu verarbeiten, also nein, das wird nicht passieren.
quelle
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
die fünf jüngsten Erwachsenen aus einem std :: vector <Person> auswählen und zurückgeben in alphabetischer Reihenfolge. Also ich würde sagen, dass C ++ für die Aufgabe angemessen ist ...Expression<T>
in der C # -Dokumentation.