Mar*_*cký 8 c++ lambda function code-cleanup
是否可以将lambda函数定义为仅在本地使用,即在当前块(函数/方法)中?考虑一些代码将要执行多次的情况(因此将它放入函数中是合乎逻辑的)但它永远不会在块之外使用.
void foo() {
auto bar = []() {
// some code applicable only inside foo()
};
bar();
bar();
bar();
}
Run Code Online (Sandbox Code Playgroud)
与bar()声明为正常功能相比,这种方法有哪些优点和缺点?
Bat*_*eba 15
如果可以选择这样做,那么是,将lambda本地化bar为特定函数.
在C++中,我们总是尽量将对象保持为本地对象.(使代码更容易理解,简化文档,便于重构,&c.&c ..)
Ric*_*ges 10
我同意这是一个好习惯.高级逻辑几乎总是比低级逻辑更容易阅读.我经常以这种方式编写函数:
void foo()
{
// introduce actors here
auto something = make_something();
// introduce detailed definitions
auto bing = [&]()->bool { ... }; // define what binging means
auto bong = [&]() { ... }; // define what bonging means
// perform logic
while (bing())
bong();
}
Run Code Online (Sandbox Code Playgroud)
请记住,从c ++ 17开始,lambda constexpr默认为.gcc et.人.经常完全优化它们.这些都不是性能考虑因素.
你能行的.主要问题是它会更具可读性吗?把它放在外面可以减少压痕.
你应该问的问题:
从正确/标准的角度来看,这当然是可以的.除此之外,这个问题主要是基于意见的.
Lambdas是C++中的众多工具之一.他们在"复制粘贴以便重复使用"(代码嗅觉)和"将其提取到函数中"之间添加了另一层结构.我个人非常喜欢函数本地lambda用于完全列出的目的:您正在重用一小段仅在此函数范围内有意义的代码.
有人认为它应该仍然是它自己的功能(因为你的所有功能都是5行或更短,对吧?好吧,我怀疑它......).特别是,如果你想重用那个lambda代码,它肯定应该是它自己的函数.但在此之前,这是值得考虑具有该代码的好处就在那里旁边用在哪里,而不是一个屏幕或多个滚动而去.此外,两种方法都给操作命名,但lambda需要较少的开销(例如私有成员函数膨胀).在同一页面上,向标题添加私有成员函数会触发重新编译,而在其中添加lambda .cpp则不会.
最后,考虑什么会使代码最具可读性.如果使用lambda或将其提取到函数之间的代码清晰度差异很小(不太可能),则编写代码的便利性开始变得重要,为此上述考虑因素发挥作用.
至于测试,它取决于你想要测试的细粒度.lambda表达式是否return a && b && (a == b);真的需要测试?如果它只是内联使用(即没有提取为lambda或函数),你会测试它吗?在某些时候它会浪费时间,但在SO答案中确定这一点是不可能的.