6

我的问题是指:

使用 lambda 表达式与私有方法

现在 lambda 仿函数是 C++ 的一部分,它们可以用来整理类的接口。lambda 使用与私有方法使用在 C++ 中如何比较?是否存在比整洁的类接口更好的替代方案?

4

5 回答 5

6

尽管 lambdas 绝对可以替代一些私有成员函数,但将它们视为整理类接口的一种手段,对 lambdas 和私有成员函数的看法过于狭隘。

私有成员函数(以及一般的函数)是代码重用的基本单元。它们让您编写一段逻辑一次,然后将其隐藏在函数名称后面。

尽管 lambdas 可以在某些上下文中替换私有成员函数,但它们可以替换该函数作为其成员的对象,这远不止于此。由于 lambda 能够捕获它们周围的上下文,您可以获得一种创建代码块的方法,这些代码块不仅可以使用您的对象,还可以使用本地变量的状态。在 lambdas 之前,您需要为此创建一个特殊的类;lambda 让您可以动态创建这样的类,以获得更好的可读性。

于 2013-09-14T19:27:48.120 回答
5

是否存在比整洁的类接口更好的替代方案?

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

例如:

// Foobar.cpp
#include "Foobar.h"

namespace {

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

}


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

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

于 2013-09-14T19:23:41.057 回答
3

Lambda 是一种将逻辑移动到代码流中的方法。唯一的目的是提高可读性,他们可以帮助也可以伤害

  • 如果 private/lambda 很短,读者通常更容易在现场理解它,而不必记住稍后再查看不同的函数。
  • 如果 private/lambda 很长,并且看起来与调用它的代码不一致,这可能会分散读者对代码中更大模式的注意力。 想象一下,如果您正在阅读这些 StackOverflow 答案之一,并且突然不得不停下来阅读 StackEnglish 对无效和无效的描述以理解答案。您真的宁愿只看到“可选信息”的超链接,而不是内容的复制/粘贴。
  • 构造一个持有上值参数的 lambda 比构造一个私有仿函数来做同样的事情要容易得多。这可以增加可读性,因为 lambda 在实现该目标时具有较少的样板。
  • lambdas 更难在代码段之间共享。如果您发现自己从许多地方调用相同的函数,私有函数可能是更好的匹配。
于 2013-09-14T19:37:18.910 回答
3

lambda 使用与私有方法在 C++ 中的使用比较

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

另外,应该努力保持接口最小化,因为更改它们的成本更高。出于这个原因,像 pimpl 这样的习语很受欢迎,出于同样的原因,lambda 可能比成员函数更受欢迎。正如另一个人所提到的,人们应该认为函数也是重用工具,但在这种情况下,我更喜欢带有私有函数的 pimpl,它否定了为此目的重用 lambdas。

于 2013-09-14T19:33:56.040 回答
2

如果您问我,这与个人品味有关,两者之间的差异并不大。

Lambdas 对 stl 算法非常有用,而私有方法并不那么舒服,另一方面,如果你想重用代码,我发现私有方法要好得多。

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

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

尽管它使课程变得混乱,但它使功能变得混乱,我觉得这更糟。

于 2013-09-14T19:24:44.513 回答