2009-08-03 77 views
8

最近,我对VC2010中对lambda的支持感到非常兴奋。我正在慢慢掌握这个功能将C++转化为更好的东西的全部潜力。C++ 0x的图书馆计划?

但是后来我意识到这种潜力很大程度上取决于像boost和QT这样的日常库中主流支持lambda。
有谁知道是否有计划将这些库扩展为C++ 0x的新特性?

lambda实际上取代了对boost :: lambda的需求,以及与boost交互的所有内容。 QT可以在其所有容器中添加对lambda的支持,甚至可以作为定义的替代方法SLOT s

+1

'的boost ::另一件事不被替换lambda表达式目标bind`。 `std :: bind`将完成绑定函数的工作。相反,lambdas将部分替换`boost :: lambda`(及其后继者,boost :: phoenix,afaik)中的功能。 lambda目前不能做的是`boost :: lambda`的多态性。创建可用于任何参数类型的函数的能力:`_1 ++`递增任何参数类型,而`[](int&a){a ++; }`只能增加int。我现在听说概念不在C++中,多态lambda表达式又是一个选项。 – 2009-08-03 16:40:29

+1

@litb - 这很有趣,你有没有链接到材料解释为什么概念是类型参数lambdas的障碍? – 2009-08-03 17:24:48

+0

我不知道有详细讨论它的论文,但是我在usenet上读到这个论文。我想,应该有一种方法来说'需要Blah [](T t){...}`或类似的东西来使lambda的`operator()`模板受到约束。另一个问题可能是,在受限模板中,只能调用其他受约束的模板以允许对模板定义进行类型检查。因此,对于带有简单未受保护模板的`operator()`的lambda,不能在如下所示的约束模板中使用它:`template void f(T t){([](u){...}) (T); }`。 – 2009-08-03 18:50:24

回答

6

Lambdas已经非常适合现有的库 - 函数接受由模板参数给出的类型的函数对象的任何地方。

这是关于它们的伟大之处之一 - 它们是语言特征的一个典型例子,它以一种漂亮的语法编纂了现有的练习。

很明显,boost lambda库变得多余,但这意味着它不需要添加任何新功能。

3

机会是这样的库将等待,直到有相应的C++ 0x功能的编译器支持,并且在主流编译器确实支持它之前,不会有太多的麻烦。别屏住呼吸。

4

我不明白lambda的用法如何取决于库的支持。 Lambdas不需要创建许多类来包装不同的小算法,并且与其他语言/库特征整齐地结合在一起(想起std::function)。无论你传递函数对象还是函数指针,都可以使用lambdas。

所以他们主要增加另一种替代方案来利用现有的代码和库。我可以看到库更好地支持lambda的唯一方法是使用更多的功能风格的方法。

0

大多数库都使用标准函数指针进行回调。 C++ 0x lambdas可以用作函数指针,所以大多数库不需要修改。其他库使用模板,以便它们可以接受任何可调用的对象(例如,std::foreach不需要修改)。

我能想到的那个库的唯一其他C++ 0x功能可能会更改为使用强类型enums。此外,库可能会开始使用extern模板来减少编译时间。

1

这不是真的,你不能用C++ 0x lambda替换boost :: lambda。见here由于某些原因(关于增强绑定,但我认为大部分转移)

此外,@丹尼尔this可能会帮助您开始使用lambda函数/增强绑定插槽。这让我的生活变得非常简单。

另外,从我的消息来源@litb,lambda表达式都不会被改变(哎呀)