可以在C ++中获得类似.NET的LINQ的功能吗?

时间:2010-09-11 18:55:22

标签: c++ linq

可以在C ++中获得类似.NET的LINQ的功能吗?这需要语言扩展还是可以使用一些非常聪明的宏来完成?或者甚至通过像Qt的moc(元对象编译器)这样的工具?是否有任何现有的C ++ LINQ实现,如果有,它们是什么?

3 个答案:

答案 0 :(得分:6)

检查CLinq(herehere)或Linq ++(here)。 同时尝试p-stade(here);但是,它使用STL并且它没有LINQ那样的接口,但它非常完整。

答案 1 :(得分:2)

使用这个用于C ++ 11的Linq库,您可以使用类似linq的语法进行列表理解:

std::vector<int> numbers = { 1, 2, 3, 4 };
auto r = LINQ(from(x, numbers) where(x > 2) select(x * x));
for (auto x : r) printf("%i\n", x);

它使用预处理器来解析fromwhereselect子句,并使用Boost.Range适配器将其转换为相当于:

auto r = numbers 
        | boost::adaptors::filtered([](int x) { return x > 2; }) 
        | boost::adaptors::transformed([](int x) { return x * x; });

答案 2 :(得分:1)

  
    

可以在C ++中获得类似.NET的LINQ的功能吗?这需要语言扩展还是可以使用一些非常聪明的宏来完成?

  

C ++宏的功能不足以实现像LINQ一样复杂的东西。

要以库的形式实现类似LINQ的系统,语言需要:

  • 良好的嵌入式DSL功能。
  • 懒惰评估
  • 持久收藏
  • Lambda表达式
由于语言的严格语法和语义(例如,查看Boost.Spirit,然后从像Haskell这样的DSL友好语言中查看等效库),C ++中的嵌入式DSL看起来非常难看。您可以通过boost::phoenix进行延迟评估。没有可用于C ++的持久性集合库(除了FC ++,这是非常不完整的)。 Lambda表达式将在下一个语言标准中使用C ++。

即使有一天有人设法使用上述成分为C ++创建类似LINQ的系统,该系统也不如.NET中的LINQ那么好。所以,是的,可能,但不太实用。 :)

  
    

甚至通过像Qt的moc(元对象编译器)这样的工具?

  

这是非常可能的。但是它不会真的是C ++,不是吗? ;)

  
    

是否有任何现有的C ++ LINQ实现,如果有,它们是什么?

  

已朝这个方向做了一些尝试(正如其他绅士在此指出的那样)。它们都没有接近“真正的”LINQ,但它们仍然值得一看。 :)

修改
显然我对“实用”位错了。看看Yassin的答案中的p-stade链接,这是巧妙使用强大的C ++抽象可以实现的一个很好的例子。 : - )