关于c ++ 11:私有方法与C ++中的Lambda

Private methods vs Lambda in C++

我的问题是指:

使用lambda表达式与私有方法

现在lambda函子是C++的一部分,它们可以用来清除类的接口。C++中如何使用LAMBDA与私有方法比较?对于整洁的类接口有更好的选择吗?


虽然lambda确实可以替换一些私有成员函数,但是把它们看作是清理类接口的方法,对于lambda和私有成员函数的看法过于狭隘。

私有成员函数(和一般的函数)是代码重用的基本单位。它们允许您编写一段逻辑,然后将其隐藏在函数名后面。

尽管lambda可以在特定的上下文中替换私有成员函数,但是它们可以替换一个对象,该对象的函数与它一起是一个成员,而这个对象要多得多。由于lambda能够捕获它们周围的上下文,因此您可以获得一种创建代码块的方法,该代码块不仅包含对象,还包含局部变量的状态。在lambda之前,您需要为它创建一个特殊的类;lambda允许您动态地创建此类类,以获得更好的可读性。


对于整洁的类接口有更好的选择吗?

我经常使用的一种方法是在一个未命名的命名空间中提供一系列具有文件作用域的函数,这些函数充当我的成员函数的"助手"。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Foobar.cpp
#include"Foobar.h"

namespace {

    void someHelper()
    {
        std::cout <<"I'm a helper!" << std::endl;
    }

}


void Foobar::someMemberFunc()
{
    someHelper();
    [...]
}

当然,也可以在此未命名的命名空间中声明lambda和/或类。此未命名命名空间中声明的任何内容都只能从同一翻译单元(如cpp文件)中访问。


lambda是一种将逻辑移入代码流的方法。唯一的目的是提高可读性,它们可以帮助或伤害

  • 如果private/lambda很短,读者通常更容易当场理解它,而不必记住稍后查看不同的函数。
  • 如果private/lambda很长,并且与调用它的代码不一致,这会分散读者对代码中更大模式的注意力。想象一下,如果你正在阅读这些stackoverflow答案中的一个,突然不得不停下来阅读stackenglish对空的描述来理解答案。你更愿意看到一个"可选信息"的超链接,而不是内容的复制/粘贴。
  • 构造保存upvalue参数的lambda比构造私有函数执行相同操作要容易得多。这可以提高可读性,因为lambda在实现该目标时没有太多样板文件。
  • lambda很难在代码段之间共享。如果您发现自己在许多地方调用相同的函数,私有函数可能是更好的匹配。

How does lambda use vs private method use compare in C++

我们可以捕获这个指针,因此可以访问类的内部,而不会弄乱它的接口。以前,在某些情况下,需要在STL算法中使用成员或友元函数(与bind和mem_fn结合使用)。

另外,我们应该尽量保持最小的接口,因为更改接口的成本更高。因此,像pimpl这样的习惯用法很流行,同样的原因lambda可能比成员函数更受欢迎。正如另一个人所提到的,我们应该考虑到函数也是重用工具,但是在这种情况下,我更喜欢具有私有函数的PIMPL,它否定了为此目的重用lambda。


如果你问我,这里面有个人品味的问题,两者之间的差别并不大。

lambda确实很适合STL算法,而私有方法却不能做到这一点,另一方面,如果您想重用代码,我发现私有方法更好。

这个问题展示了lambdas的最佳用法:lambdas

就我个人而言,我更喜欢私人方法,尤其是在你提出的情况下。不应使用lambda代替私有方法。它使函数的主体变得混乱,并将视线从主逻辑上转移开。

虽然它使类变得整洁,但它使函数变得混乱,我觉得更糟。