是否有任何平台不可知(而不是CLI)的运动,以某种方式让LINQ进入C++?是否有C++的LINQ库?
我的意思是世界各地的UNIX服务器框架的很大一部分运行在UNIX上,并且在UNIX上可以访问LINQ for C++可能会让很多人感到高兴!
是否有任何平台不可知(而不是CLI)的运动,以某种方式让LINQ进入C++?是否有C++的LINQ库?
我的意思是世界各地的UNIX服务器框架的很大一部分运行在UNIX上,并且在UNIX上可以访问LINQ for C++可能会让很多人感到高兴!
我不认为C++有编译器糖来处理诸如lambda表达式之类的东西,所以不,这不会发生。
C++ 0X有lambda,所以它应该是理论上可行的,但是这不是一件容易的事。 – 2008-10-27 02:55:54
既然你提到了这一点,并让我思考,我可以想象的另一个选择是去QT路线,并使用预编译器将语法糖添加到C++,这可能是一个很好的选择 – 2008-10-27 02:58:56
Boost.Phoenix库也将Lambdas添加到C++中,无需任何预编译技巧。见http://tinyurl.com/d4y9se [boost.org] 当然,用C++ 0x这个东西变得更容易!一篇不错的文章如何用C++ 0x做LINQ http://tinyurl.com/d9zlsc [blogspot.com] – 2009-04-12 10:56:54
您可以看看PSade.Oven,这是一个强大的强化库,它处理STL范围,并提供很多类似LINQ的功能。
这是我对模板C++ LINQ库的解决方案。
源代码在这里:Boolinq
每个功能都有很多测试。
我正在处理它。
有何评论?
可能是建议?
UPDATE:项目移到https://github.com/k06a/boolinq,现在有只有700行的源代码:)
我写了一个小型图书馆cppLinq是重新实现IEnumerable的<>和LINQ运营商版本2.0。这只是一个实验;现在它只能在Windows上运行(使用Win32光纤实现协程),并且只能使用VS11的Dev Preview进行构建(它大量使用了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);
});
其实,如果你只是想使用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
微软,他们已经建立了LINQ C和C++ just announced。但尚未提供。
更新2012年11月6日:
微软开放技术公司目前拥有released和open-sourced(Apache许可证2.0)一些相关的图书馆,包括LINQ的实现(九++),以及它的新反应式扩展(Rx ++)库。
这是另一个alternative,它只是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);
反馈是可以的。
这里是我的C++的FPGA实现 - LINQ与C++ 11(在中国):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
它支持像 “递延查询”, “基于堆栈”(使用new运算符的小功能尽可能),“复制语义”(因此您可以在备份后迭代多重查询),等等。它还支持许多功能,包括“from,select,where,cast,range,all,any,cast,average,contains,count,first,last,head,tail,groupBy,takeUntil,skipUntil,max,分钟,减少,独特,排序,随机,相交,_union“。
我想我的代码很简单,足以让任何人自己理解和扩展。
http://cpplinq.codeplex.com/是一个很好的实现。
来自作者:
CppLinq的动机是,boolinq和Native-RX似乎都基于运营商“。”。编写列表功能。问题在于“。”运算符是它不能在C++中重载,这使得使用我自己设计的函数很难扩展这些库。对我来说这很重要。 CppLinq基于操作符>>,它是可重载的,因此可以使CppLinq可扩展。
你的意思是monad(IEnumerable <>和它的扩展方法集合)?你的意思是它的语言方面?你的意思是LINQ到SQL? – yfeldblum 2008-10-26 04:13:44
那么LINQ-SQL部分是我真正想要的部分,但这取决于LINQ的语言和monad。 – 2008-10-27 02:57:23