【问题标题】:Recursive std::functional vs recursive anonymous namespace function. Which one to use?递归 std::functional 与递归匿名命名空间函数。使用哪一个?
【发布时间】:2015-12-21 09:31:33
【问题描述】:

假设我的类有一个方法,它必须从它内部调用一些其他递归方法。

我的 .h 文件如下所示:

class MyClass() 
{
public:
    void foo();
};

我的问题是,这些实现中哪个更好(忽略无限循环):

namespace
{
    void myRecursiveFunction()
    {
        myRecursiveFunction();
    }
}
void MyClass::foo()
{
    myRecursiveFunction();
}

void MyClass::foo()
{
    std::function<void()> myRecursiveFunction =
        [&] ()
    {
        myRecursiveFunction();
    };

    myRecursiveFunction();
}

,假设 myRecursiveFunction() 只会被 foo() 调用?

当然,在现实世界中myRecursiveFunction() 做了 一些事情。我只是不想用不需要的信息填充代码。

如果我只在一种方法中使用myRecursiveFunction,我的所有班级都可以访问它吗?

【问题讨论】:

  • 第二个例子还能编译吗?为什么要创建一个额外的推理层?我不明白你问题的point
  • @YSC 大概这不是什么都没有:有一个从所说的东西调用的私有到某物的函数。
  • @YSC 我修复了编译问题。我想知道我的所有班级都可以访问myRecursiveFunction 是否可以,因为它只用于一种方法。
  • 在第二种情况下通过引用捕获,这两个函数不是严格等价的,所以你的问题是有偏见的。

标签: c++ recursion std-function


【解决方案1】:

std::function专业人士:

  • 如果仅从该函数调用递归函数,则它的范围受到了很大的限制。匿名命名空间对整个翻译单元都是可见的。该函数对翻译单元的其余部分可见是可以的,因此可以说这只是一个微小的优势。

std::function 缺点:

  • 简单函数的语法比 lambda 更简单。
  • std::function 可能有 some small overhead
  • 如果在foo 内定义std::function,则递归函数在其外部不可重用。没关系,如果它无论如何都不能重复使用的话。
  • 不适用于 c++11 之前的标准。

哪个更好取决于您需要什么以及您喜欢什么。在大多数情况下,我更喜欢简单的函数。

【讨论】:

    【解决方案2】:

    是的,可以在匿名命名空间中定义 myRecursiveFunction(),即使它对您的所有类的实现可见,即使只有 MyClass::foo() 调用它。

    大概,你控制你的类实现,你不会在没有理由的地方调用myRecursiveFunction()。这适用于所有功能:你会在不应该打电话的地方打电话给abort()吗?尽管全班同学都可以访问它。

    使用递归局部 lambda 只会增加一层推理,并使代码更难阅读。如果这是您程序中对时间要求严格的部分,您可能会使用std::function 使其变慢。

    【讨论】:

      猜你喜欢
      • 2022-06-20
      • 2012-11-05
      • 2015-11-21
      • 2011-01-29
      • 2011-04-22
      • 2020-09-24
      • 2011-10-26
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多