lambda函数什么时候对C++中的类有用
When would lambda functions be useful for classes in C++?
因此,当lambda函数用于替换函子时,我看到了它们的有用性,但通常情况下,您希望何时在面向对象编程(带类)设置中使用它们,为什么?
好吧,这是一个比我的评论更有帮助(也更少)的回应。
闭包(也就是说,在其他函数中声明的函数,它们捕获外部函数的变量)是实现类的一种有趣的反向通道方式。手表:
auto MakeCounter(int initialCount)
{
int currentCount = initialCount;
struct {
std::function<void()> increment = [&]() { currentCount++; };
std::function<int()> getCount = [&]() { return currentCount; };
} theCounter;
return theCounter;
}
现在theCounter
是一个有两个成员的结构,一个成员递增计数,另一个成员检索当前计数。请注意,结构本身不需要存储当前计数;而是由在它们之间共享currentCount
的两个Lambda隐式地持有。
这有一些问题。
- 它不可编译。甚至大部分都没有。这个代码片段有很多错误。事实上,它崩溃了GCC 4.9。哇
- 即使它进行了编译,它也不会正常工作,因为C++闭包的功能不是很强大——它们无法在作用域结束后保持捕获的变量的活力。只有具有实际GC的语言才能做到这一点
- C++已经有了类,为什么还要麻烦呢
尽管如此,在其他语言中也可以看到这种模式,它们要么支持(适当的)闭包和GC,但没有类的本地功能(例如LISP的一些变体),要么支持类,但非常糟糕,可以说这样做更好(例如Matlab)。
所以在C++中,它们只是用来替换函子样板。他们不提供任何额外的动力。在其他一些语言中,它们更通用,也更重要。
相关文章:
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 其中降频广播实际上是有用的
- 既然我们有内联变量,extern const 还有用吗?
- 函子还有更有用的用例吗?
- `__declspec(novtable)`没有用吗
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?
- 在现代C++中,临时寿命延长何时有用?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 是否有任何情况下,具有已删除CTOR的课程可能有用
- KeyEqual 在 std::unordered_set/std::unordered_map 中的有用性
- std::make_pair 和 std::make_tuple 在 C++17 中的有用性
- 如果我在 Xbox UWP 应用程序上收到激活错误并且错误消息中没有任何有用的内容,该怎么办
- std::unique_ptr<std::array<T,N是否有用例>>
- 自C 11以来,挥发性在并发编程中的有用性
- 是在实践中有用的释放序列的概念
- 移动const对象是否有有用的方案
- 在C++中声明一个类"final : public virtual"有用吗?