2008-10-24 63 views
69

是否有任何平台不可知(而不是CLI)的运动,以某种方式让LINQ进入C++?是否有C++的LINQ库?

我的意思是世界各地的UNIX服务器框架的很大一部分运行在UNIX上,并且在UNIX上可以访问LINQ for C++可能会让很多人感到高兴!

+0

你的意思是monad(IEnumerable <>和它的扩展方法集合)?你的意思是它的语言方面?你的意思是LINQ到SQL? – yfeldblum 2008-10-26 04:13:44

+0

那么LINQ-SQL部分是我真正想要的部分,但这取决于LINQ的语言和monad。 – 2008-10-27 02:57:23

回答

-1

我不认为C++有编译器糖来处理诸如lambda表达式之类的东西,所以不,这不会发生。

+5

C++ 0X有lambda,所以它应该是理论上可行的,但是这不是一件容易的事。 – 2008-10-27 02:55:54

+0

既然你提到了这一点,并让我思考,我可以想象的另一个选择是去QT路线,并使用预编译器将语法糖添加到C++,这可能是一个很好的选择 – 2008-10-27 02:58:56

+7

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

2

C++ 0x,或者不管结果被称为什么,都会有一个新的关键字auto,它允许进行类型推断。是的,会有lambda的C++。此外,快速Google搜索显示,CLinq

7

您可以看看PSade.Oven,这是一个强大的强化库,它处理STL范围,并提供很多类似LINQ的功能。

32

Linq++受洪江看起来是个不错的开始。它的语法比CLINQ更接近Linq。由pfultz2编写的Linq看起来也很有趣,但它需要一个C++ 11编译器。

12

这是我对模板C++ LINQ库的解决方案。
源代码在这里:Boolinq
每个功能都有很多测试。
我正在处理它。

有何评论?
可能是建议?

UPDATE:项目移到https://github.com/k06a/boolinq,现在有只有700行的源代码:)

7

我写了一个小型图书馆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); 
}); 
3

其实,如果你只是想使用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 
17

微软,他们已经建立了LINQ C和C++ just announced。但尚未提供。

更新2012年11月6日:

微软开放技术公司目前拥有releasedopen-sourced(Apache许可证2.0)一些相关的图书馆,包括LINQ的实现(九++),以及它的新反应式扩展(Rx ++)库。

2

这是另一个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); 

反馈是可以的。

2

这里是我的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“。

我想我的代码很简单,足以让任何人自己理解和扩展。

9

http://cpplinq.codeplex.com/是一个很好的实现。
来自作者:
CppLinq的动机是,boolinq和Native-RX似乎都基于运营商“。”。编写列表功能。问题在于“。”运算符是它不能在C++中重载,这使得使用我自己设计的函数很难扩展这些库。对我来说这很重要。 CppLinq基于操作符>>,它是可重载的,因此可以使CppLinq可扩展。