私有方法与 Lambda 在C++
Private methods vs Lambda in C++
我的问题是指:
使用 lambda 表达式与私有方法
现在 lambda 函子是 C++ 的一部分,它们可以用来整理类的接口。lambda 使用与私有方法使用在C++中如何比较?是否有更好的替代方法来整理类接口?
尽管 lambda 绝对可以替换一些私有成员函数,但将它们视为整理类接口的方法对 lambda 和私有成员函数的看法过于狭隘。
私有成员函数(以及一般的函数)是代码重用的基本单元。它们允许您编写一次逻辑,然后将其隐藏在函数名称后面。
尽管 lambda 可以在某些上下文中替换私有成员函数,但它们可以替换该函数作为其成员的对象,这更多。由于 lambda 能够捕获它们周围的上下文,因此您可以获得一种创建代码块的方法,这些代码块不仅包含您的对象,还包含局部变量的状态。在 lambda 之前,您需要为此创建一个特殊的类;lambda 允许您动态创建此类类,以获得更好的可读性。
是否有更好的替代方法来整理类接口?
我经常使用的一种方法是在未命名的命名空间中提供一系列具有文件范围的函数,这些函数充当我的成员函数的"帮助程序"。
例如:
// Foobar.cpp
#include "Foobar.h"
namespace {
void someHelper()
{
std::cout << "I'm a helper!" << std::endl;
}
}
void Foobar::someMemberFunc()
{
someHelper();
[...]
}
当然,您也可以在这个未命名的命名空间中声明 lambda 和/或类。在这个未命名的命名空间中声明的任何内容都只能从同一个翻译单元(例如,cpp 文件)中访问。
Lambda 是一种将逻辑移动到代码流中的方法。 唯一的目的是提高可读性,他们可以提供帮助,也可以伤害
- 如果私有/lambda很短,读者通常更容易当场理解它,而不必记住稍后查看不同的函数。
- 如果私有/lambda 很长,并且看起来与调用它的代码不协调,这可能会分散读者对代码中更大模式的注意力。 想象一下,如果你正在阅读这些StackOverflow答案之一,突然不得不停下来阅读StackEnglish对null和void的描述来理解答案。 您真的宁愿只看到"可选信息"的超链接,而不是内容的复制/粘贴。
- 构造一个保留上值参数的 lambda 比构造一个私有函子来做同样的事情要容易得多。 这可以提高可读性,因为 lambda 在实现该目标时具有较少的样板。
- lambda 更难在代码部分之间共享。 如果您发现自己从许多地方调用相同的函数,私有函数可能是更好的匹配。
lambda 使用与私有方法使用在C++中如何比较
可以捕获 this 指针,因此可以访问类的内部结构而不会弄乱其接口。以前,在某些情况下,在 stl 算法中需要成员或友元函数(与绑定和mem_fn结合使用)。
此外,应该努力保持接口最小,因为更改它们的成本更高。出于这个原因,像 pimpl 这样的习语很受欢迎,出于同样的原因,lambda 可能优于成员函数。正如另一个人提到的,应该考虑函数也是重用的工具,但在这种情况下,我更喜欢带有私有函数的 pimpl,它否定了为此目的重用 lambda。
如果你问我,它有一个个人品味的问题,两者之间的差异并不大。
Lambda 对于 stl 算法来说真的很好,而私有方法则不那么容易,另一方面,如果你想重用你的代码,我发现私有方法要好得多。
这个问题显示了lambdas imo的最佳用法:lambdas
就个人而言,我更喜欢私人方法,尤其是在您提出的情况下。不应使用 Lambda 代替私有方法。它使函数的主体混乱,并将视线从主逻辑上转移开。
虽然它使类变得整洁,但它使功能混乱,我觉得情况更糟。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?