是否有任何平台不可知(而非CLI)动作以某种方式让LINQ进入C++?
我的意思是世界各地的服务器框架的很大一部分运行在UNIX的风格上,并且在UNIX上访问LINQ for C++可能会让很多人开心!
k06*_*06a 16
这是我的模板C++ LINQ库的解决方案.
源代码在这里:Boolinq
每个功能都有很多测试.
我现在正在努力.
任何意见?
可能是建议?
更新:项目转移到https://github.com/k06a/boolinq,现在有2.0版本,只有700行源代码:)
http://cpplinq.codeplex.com/是一个非常好的实现.
来自作者:
CppLinq的动机是boolinq和Native-RX似乎都是基于运算符".".编写列表函数.问题是"." 运算符是它不能在C++中重载,这使得很难用我自己设计的函数扩展这些库.对我来说这很重要.CppLinq基于运算符>>,它是可重载的,因此CppLinq可以是可扩展的.
我编写了一个小型库cppLinq,它重新实现了IEnumerable <>及其LINQ运算符.这只是一个实验; 目前它仅适用于Windows(协同程序使用Win32光纤实现),并且只使用VS11的开发预览版构建(它大量使用lambda表达式:-)).
它允许编写如下代码:
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);
});
Run Code Online (Sandbox Code Playgroud)
实际上,如果您只想使用 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);
}
Run Code Online (Sandbox Code Playgroud)
这将输出:
Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
Run Code Online (Sandbox Code Playgroud)
Fly*_*wat -5
我认为 C++ 没有编译器糖来处理 lambda 表达式之类的事情,所以不,这不会发生。