lambda函数何时对C ++中的类有用?

时间:2015-04-01 16:24:49

标签: c++ lambda

所以,我看到lambda函数在用于替换仿函数时的用处,但是什么时候你想在面向对象的编程(使用类)设置中使用它们,为什么?

1 个答案:

答案 0 :(得分:0)

好的,比我的评论更多(而且更少)有用的回应。

闭包(即在其他函数中声明的函数,捕获外部函数的变量)是实现类的一种有趣的反向通道方式。观看:

auto MakeCounter(int initialCount)
{
    int currentCount = initialCount;
    struct {
        std::function<void()> increment = [&]() { currentCount++; };
        std::function<int()> getCount = [&]() { return currentCount; };
    } theCounter;

    return theCounter;
}

现在theCounter是一个有两个成员的结构,一个用于递增计数,另一个用于检索当前计数。请注意,struct本身不需要存储当前计数;而是由两个lambdas隐含地保持,它们之间共享currentCount

这有一些问题。

  1. 它不编译。甚至不是大多数。这段代码片段有很多问题。实际上,它崩溃了GCC 4.9 。 Whee!
  2. 即使它确实编译了,它也无法正常工作,因为C ++闭包不是很强大 - 它们在作用域结束后无法保持捕获的变量。只有具有实际GC的语言才能执行此操作。
  3. C ++已经有了类,所以为什么要这么麻烦?
  4. 然而,你在其他语言中看到这种模式,它支持(正确)闭包和GC,但是没有类的本机设施(例如LISP的某些变体),或者支持类但是如此糟糕以至于它可以说是更好地以这种方式做事(例如Matlab)。

    所以在C ++中,它们只是用于替换仿函数样板。它们不提供任何额外的电力。在其他一些语言中,它们更具通用性,而且更为广泛。