使用lambdas做嵌套函数

Arc*_*ero 12 c++ c++11

大家对使用lambdas在C++中做嵌套函数有什么看法?例如,而不是这样:

static void prepare_eggs()
{
   ...
}

static void prepare_ham()
{
   ...
}

static void prepare_cheese()
{
   ...
}

static fry_ingredients()
{
   ...
}

void make_omlette()
{
    prepare_eggs();
    prepare_ham();
    prepare_cheese();
    fry_ingredients();
}
Run Code Online (Sandbox Code Playgroud)

你做这个:

void make_omlette()
{
    auto prepare_eggs = [&]()
    {
       ...
    };

    auto prepare_ham = [&]()
    {
       ...
    };

    auto prepare_cheese = [&]()
    {
       ...
    };

    auto fry_ingredients = [&]()
    {
       ...
    };


    prepare_eggs();
    prepare_ham();
    prepare_cheese();
    fry_ingredients();
}
Run Code Online (Sandbox Code Playgroud)

来自通过使用Pascal学习如何编码的一代,嵌套函数对我来说非常有意义.但是,在代码审查期间,这种用法似乎让我工作组中一些经验不足的开发人员感到困惑,因为我以这种方式使用了lambdas.

Tim*_*imo 12

我没有看到嵌套函数本身有什么问题.我将lambdas用于嵌套函数,但只有在满足某些条件时:

  • 它不止一次被称为.(如果不太长,只需直接编写代码)
  • 它实际上是一个内部函数,因此在任何其他上下文中调用它都没有意义.
  • 它足够短(最多10行).

因此,在您的示例中,我不会将lambdas用于第一个原因.

概念上嵌套的函数可能与类中的私有方法有用的原因相同.它们强制执行封装,并且可以更轻松地查看程序的结构.如果函数是某个其他函数的实现细节,那么为什么不明确地这样做呢?

我看到的最大问题是可读性; 读取具有大量嵌套和缩进的代码更加困难.此外,人们对lambdas不太满意,但预计会有阻力.

  • 使用本地函数的另一个原因是您是否使用本地类型。 (2认同)

Bra*_*vic 7

对于任何给定的代码片段,请根据需要将其设为可见,尽可能隐藏:

  • 如果这段代码只在一个地方使用,那就写在那里.
  • 如果它在同一函数内的多个位置使用,则通过lambdas模拟嵌套函数.
  • 如果它被多个功能使用,请将其置于适当的功能中.


Nik*_*nić 2

通过收到的评论,您已经可以猜测您正在做一些非正统的事情。这就是 C++ 名声不佳的原因之一,人们从未停止滥用它。Lambda 主要用作标准库算法和需要某种回调机制的地方的内联函数对象。我认为这涵盖了 99% 的用例,并且应该保持这种状态!

正如 Bjarne 在他的一次演讲中所说:“并非所有东西都应该是模板,也不是所有东西都应该是对象。”

并不是所有东西都应该是 lambda :) 独立函数没有任何问题。