代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

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

  •  3
  • Jake Petroules  · 技术社区  · 14 年前

    3 回复  |  直到 14 年前
        1
  •  6
  •   yassin    14 年前

    检查临床( here here here ). 也可以试试p-stade( here );但是,它使用STL,并且它没有与LINQ相同的接口,但是它非常完整。

        2
  •  2
  •   Paul Fultz II    13 年前

    用这个 Linq 用于C++ 11的库,可以使用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);
    

    它使用预处理器来解析 from , where ,和 select Boost.Range 适配器:

    auto r = numbers 
            | boost::adaptors::filtered([](int x) { return x > 2; }) 
            | boost::adaptors::transformed([](int x) { return x * x; });
    
        3
  •  1
  •   one-zero-zero-one    14 年前

    C++宏没有足够强大的功能来实现与LINQ一样复杂的东西。

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

    • 懒惰的评价
    • Lambda表达式

    由于语言的严格语法和语义,C++中嵌入的DSL看起来非常丑陋(例如,请参见振奋精神然后看一个来自DSL友好语言(如Haskell)的等价库。你可以通过 boost::phoenix

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

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

    这是很有可能的。但是它不会真的是C++,对吧?;)

    在这个方向上已经做了一些尝试(正如这里的另一位先生所指出的)。它们没有一个接近“真正的”LINQ,但它们仍然值得一看。:)


    很明显我在“实用”一点上错了。看看亚辛的答案中的P- STAD链接,这是一个很好的例子,它可以通过使用强大的C++抽象来实现。:-)