私有方法与C ++中的Lambda相比

时间:2013-09-14 19:14:30

标签: c++ c++11

我的问题是:

Using a lambda expression versus a private method

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

5 个答案:

答案 0 :(得分:5)

是否存在更好的unclutter类接口替代方案?

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

例如:

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

namespace {

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

}


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

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

答案 1 :(得分:5)

虽然lambdas肯定可以替换某些私有成员函数,但将它们视为整理类接口的方法,对于lambdas和私有成员函数的视图都过于狭窄。

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

虽然lambdas可以在某些上下文中替换私有成员函数,但是它们可以替换该函数与其成员的对象,这是更多的东西。由于lambda能够捕获它们周围的上下文,因此您可以创建一种方法来创建不仅包含对象的代码块,还包含局部变量的状态。在lambdas之前你需要为它创建一个特殊的类; lambdas允许你动态创建这样的类,以便更好地阅读。

答案 2 :(得分:3)

  

lambda如何使用vs私有方法在C ++中使用compare

可以捕获this指针,因此可以访问类的内部,而不会使其界面混乱。以前,在某些情况下,需要在stl算法中使用成员或朋友函数(与bind和mem_fn结合使用)。

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

答案 3 :(得分:3)

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

  • 如果私人/ lambda很短,读者通常更容易在现场理解它,而不必记得以后再看一个不同的功能。
  • 如果private / lambda很长,并且与调用它的代码看起来不一致,这会分散读者对代码中更大模式的注意力。 想象一下,如果您正在阅读其中一个StackOverflow答案,并突然不得不停下来阅读StackEnglish对null and void的描述以理解答案。你真的只是看到“可选信息”的超链接,而不是内容的复制/粘贴。
  • 构造一个保持upvalue参数的lambda要比构造一个私有的functor来做同样的事情要容易得多。这可以提高可读性,因为lambda在完成该目标时具有较少的样板。
  • lambdas在代码段之间分享起来比较困难。如果您发现自己在很多地方调用相同的功能,私有功能可能会更好地匹配。

答案 4 :(得分:2)

如果你问我,它有个人品味,两者之间的区别并不大。

Lambdas对stl算法非常有用,而私有方法并不适合这种方法,另一方面,如果你想重用你的代码,我会发现私有方法要好得多。

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

就个人而言,我更喜欢私人方法,特别是在你提出的情况下。不应使用Lambdas而不是私有方法。它使功能的主体变得杂乱,并使眼睛偏离主逻辑。

虽然它整理了整个课程,但它使这个功能变得混乱,我发现情况更糟。