可以在C ++中获得类似.NET的LINQ的功能吗?这需要语言扩展还是可以使用一些非常聪明的宏来完成?或者甚至通过像Qt的moc(元对象编译器)这样的工具?是否有任何现有的C ++ LINQ实现,如果有,它们是什么?
答案 0 :(得分:6)
答案 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);
它使用预处理器来解析from
,where
和select
子句,并使用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的系统,语言需要:
boost::phoenix
进行延迟评估。没有可用于C ++的持久性集合库(除了FC ++,这是非常不完整的)。 Lambda表达式将在下一个语言标准中使用C ++。
即使有一天有人设法使用上述成分为C ++创建类似LINQ的系统,该系统也不如.NET中的LINQ那么好。所以,是的,可能,但不太实用。 :)
甚至通过像Qt的moc(元对象编译器)这样的工具?
这是非常可能的。但是它不会真的是C ++,不是吗? ;)
是否有任何现有的C ++ LINQ实现,如果有,它们是什么?
已朝这个方向做了一些尝试(正如其他绅士在此指出的那样)。它们都没有接近“真正的”LINQ,但它们仍然值得一看。 :)
修改强>
显然我对“实用”位错了。看看Yassin的答案中的p-stade链接,这是巧妙使用强大的C ++抽象可以实现的一个很好的例子。 : - )