Существуют ли какие-либо движения, не зависящие от платформы (не CLI), для того, чтобы каким-то образом LINQ переходил на C ++?
Я имею в виду, что большая часть серверных фреймворков по всему миру работает на разновидностях UNIX, и наличие доступа к LINQ для C ++ в UNIX, вероятно, сделает многих людей счастливыми!
Ответы:
Linq ++ от Hong Jiang выглядит хорошим началом. Его синтаксис намного ближе к Linq, чем к CLinq. Linq от pfultz2 тоже выглядит интересно, но для этого нужен компилятор C ++ 11.
источник
Это мое решение библиотеки шаблонов C ++ LINQ.
Исходный код находится здесь: Boolinq
Для каждой функции есть много тестов.
Я работаю над этим прямо сейчас.
Любые комментарии?
Может быть советы?
ОБНОВЛЕНИЕ: проект перемещен на https://github.com/k06a/boolinq и теперь имеет версию 2.0 всего с 700 строками исходного кода :)
источник
Q_FOREACH
. Вероятно, из-заQ_FOREACH
прекращения производства.#define foreach for_each
затем после include:#undef foreach
и затем включить заголовки Qt.Microsoft только что объявила о создании LINQ для C и C ++. Однако пока недоступен.
Обновление 11.06.2012:
Microsoft Open Technologies, Inc. теперь выпустила с открытым исходным кодом (Apache License 2.0) ряд связанных библиотек, включая реализацию LINQ (Ix ++) и новую библиотеку Reactive Extensions (Rx ++).
источник
http://cpplinq.codeplex.com/ - очень хорошая реализация.
От автора:
CppLinq мотивирован тем, что и boolinq, и Native-RX, похоже, основаны на операторе "." составить список функций. Проблема в том, что символ "." Оператор заключается в том, что он не может быть перегружен в C ++, что затрудняет расширение этих библиотек функциями моей собственной разработки. Для меня это важно. CppLinq основан на операторе >>, который может быть перегружен, поэтому CppLinq можно сделать расширяемым.
источник
Вы можете взглянуть на PSade.Oven , сильно усовершенствованную библиотеку, работающую с диапазонами STL и предоставляющую множество функций, подобных LINQ.
источник
Я написал небольшую библиотеку cppLinq, которая повторно реализует IEnumerable <> и его операторы LINQ. Это просто эксперимент; пока что он работает только в Windows (сопрограммы реализованы с помощью волокон Win32) и строится только с предварительным просмотром для разработчиков VS11 (в нем интенсивно используются лямбда-выражения :-)).
Это позволяет писать такой код:
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); });
источник
shared_ptr
s наunique_ptr
s, так как последнее может быть преобразовано в первое, но не наоборот. Кроме того, style thingy, вам не нужен-> double
возвращаемый тип. Просто позвольте неявным преобразованиям делать свое дело.Вот еще одна альтернатива, которая представляет собой просто оболочку для алгоритмов boost и stl, и, таким образом, вы получаете большую часть преимуществ производительности этих реализаций.
Это работает так:
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>>();
Обратите внимание, что некоторые методы возвращают прокси для пустых диапазонов, например
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);
Обратная связь приветствуется.
источник
На самом деле, если вы просто хотите использовать Linq для понимания списка, вы можете использовать эту библиотеку Linq . Для этого требуется C ++ 11 (хотя он будет работать в MSVC 2010) и Boost. С помощью библиотеки вы можете писать запросы linq следующим образом:
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); }
Что выведет:
Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91
источник
В C ++ 0x или чем-то еще, что он вызывает, действительно есть новое ключевое слово,
auto
которое позволяет делать вывод типа. И да, лямбда придет на C ++. Кроме того, быстрый поиск в Google показал это, CLinq .источник
Вот моя реализация c ++ - linq с c ++ 11 (на китайском языке):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
Он поддерживает такие функции, как «отложенный запрос», «на основе стека» (как можно реже используйте оператор new), «семантическое копирование» (чтобы вы могли выполнять итерацию запроса в несколько раз после резервного копирования) и т. Д.
Он также поддерживает множество функций, включая "from, select, where, cast, range, all, any, cast, average, contain, count, first, last, head, tail, groupBy, takeUntil, skipUntil, max, min, reduce, уникальный, сортировка, случайный, пересечение, _union ".
Я думаю, что мой код достаточно прост, чтобы его мог понять и расширить кто угодно.
источник
Я не думаю, что в C ++ есть сахар компилятора для обработки таких вещей, как лямбда-выражения, поэтому нет, этого не произойдет.
источник
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
выбрать пять самых молодых взрослых из std :: vector <Person> и вернуть их в алфавитном порядке. Поэтому я бы сказал, что C ++ подходит для этой задачи ...Expression<T>
в документации по C #.