Czy istnieją jakieś ruchy niezależne od platformy (nie CLI), aby LINQ zaczął w jakiś sposób C ++?
Mam na myśli, że znaczna część frameworków serwerowych na całym świecie działa na odmianach UNIX, a dostęp do LINQ for C ++ w systemie UNIX prawdopodobnie uszczęśliwiłby wiele osób!
Odpowiedzi:
Linq ++ autorstwa Hong Jiang wygląda na dobry początek. Jego składnia jest znacznie bliższa Linq niż CLinq. Linq autorstwa pfultz2 również wygląda interesująco, ale potrzebuje kompilatora C ++ 11.
źródło
To jest moje rozwiązanie biblioteki C ++ LINQ szablonu.
Kod źródłowy jest tutaj: Boolinq
Istnieje wiele testów każdej funkcji.
Właśnie nad tym pracuję.
Jakieś uwagi?
Czy mogą być porady?
UPDATE: projekt został przeniesiony na https://github.com/k06a/boolinq i ma teraz wersję 2.0 z zaledwie 700 liniami kodu źródłowego :)
źródło
Q_FOREACH
. Prawdopodobnie z powoduQ_FOREACH
wycofania.#define foreach for_each
potem po include:#undef foreach
a następnie dołączyć nagłówki Qt.Firma Microsoft właśnie ogłosiła , że stworzyła LINQ dla C i C ++. Jednak jeszcze niedostępny.
Aktualizacja 11.06.2012:
Firma Microsoft Open Technologies, Inc. wydała i udostępniła na zasadach open source (licencja Apache 2.0) szereg powiązanych bibliotek, w tym implementację LINQ (Ix ++) i nową bibliotekę Reactive Extensions (Rx ++).
źródło
http://cpplinq.codeplex.com/ to bardzo dobra implementacja.
Od autora:
Motywacją dla CppLinq jest to, że zarówno boolinq, jak i Native-RX wydają się być oparte na operatorze "." do tworzenia funkcji list. Problem w tym, że „.” jest taki, że nie może być przeciążony w C ++, co utrudnia rozszerzenie tych bibliotek o funkcje mojego własnego projektu. To jest dla mnie ważne. CppLinq jest oparty na operatorze >>, który jest przeciążalny, więc CppLinq można uczynić rozszerzalnym.
źródło
Możesz rzucić okiem na PSade.Oven , mocno rozbudowaną bibliotekę pracującą na zakresach STL i udostępniającą wiele funkcji podobnych do LINQ.
źródło
Napisałem małą bibliotekę cppLinq, która ponownie implementuje IEnumerable <> i jej operatory LINQ. To tylko eksperyment; na razie działa tylko w systemie Windows (programy są implementowane z włóknami Win32) i buduje się tylko z wersją Dev Preview VS11 (intensywnie wykorzystuje wyrażenia lambda :-)).
Pozwala pisać taki kod:
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); });
źródło
shared_ptr
s naunique_ptr
s, ponieważ to drugie można zamienić na pierwsze, ale nie odwrotnie. Poza tym stylowy, nie potrzebujesz-> double
typu zwracanego. Po prostu pozwól niejawnym konwersjom wykonać swoją pracę.Oto inna alternatywa która jest po prostu opakowaniem algorytmów doładowania i stl, dzięki czemu uzyskujesz większość korzyści z wydajności tych implementacji.
Działa to tak:
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>>();
Zauważ, że niektóre metody zwracają proxy dla pustych zakresów, np
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);
Opinie są mile widziane.
źródło
Właściwie, jeśli chcesz używać Linq tylko do rozumienia list, możesz użyć tej biblioteki Linq . Wymaga C ++ 11 (będzie jednak działać w MSVC 2010) i Boost. Dzięki bibliotece możesz pisać zapytania linq w następujący sposób:
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); }
Który wyświetli:
Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91
źródło
C ++ 0x, lub cokolwiek zostanie wywołane, ma nowe słowo kluczowe o nazwie,
auto
które umożliwia wnioskowanie o typie. I tak, nadejdzie lambda dla C ++. Ponadto szybkie wyszukiwanie w Google ujawniło to, CLinq .źródło
Oto moja implementacja c ++ - linq z c ++ 11 (po chińsku):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
Obsługuje takie funkcje, jak „odroczone zapytanie”, „oparte na stosie” (używaj operatora new jak najmniej), „kopiuj semantyczne” (aby można było iterować zapytanie multitime po utworzeniu kopii zapasowej) i tak dalej.
Obsługuje również dziesiątki funkcji, w tym „from, select, where, cast, range, all, any, cast, Average, include, count, first, last, head, tail, groupBy, takeUntil, skipUntil, max, min, redukuj, unikalne, sortowanie, losowe, przecięcie, _union ”.
Myślę, że mój kod jest wystarczająco prosty, aby każdy mógł go zrozumieć i rozszerzyć.
źródło
Nie sądzę, by C ++ miał cukier kompilatora do obsługi takich rzeczy, jak wyrażenia lambda, więc nie, to się nie stanie.
źródło
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
wybrać pięciu najmłodszych dorosłych ze std :: vector <Person> i zwrócić je w porządku alfabetycznym. Więc powiedziałbym, że C ++ jest wystarczające do tego zadania ...Expression<T>
z dokumentacją języka C #.