递归 std::functional 与递归匿名命名空间函数。使用哪一个?

Recursive std::functional vs recursive anonymous namespace function. Which one to use?

假设我的 class 有一个方法必须从其中调用其他递归方法。

我的 .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()某事。我只是不想用不需要的信息填充代码。

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

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

据推测,您可以控制 class 实施,并且不会在没有理由的情况下调用 myRecursiveFunction()。这适用于所有功能:您会在不应该调用的地方调用 abort() 吗?尽管您的整个 class.

都可以访问它

使用递归本地 lambda 只会增加一层推理,并使代码更难阅读。如果这是你程序的时间关键部分,你可能会通过使用 std::function.

来降低它的速度

std::function 优点:

  • 如果仅从该函数调用递归函数,那么它的作用域就会受到很好的限制。匿名命名空间对整个翻译单元可见。该功能对翻译单元的其余部分可见是可以的,因此可以说这只是一个微小的优势。

std::function 缺点:

  • 简单函数的语法比 lambda 更简单。
  • std::function 可能会有 some small overhead.
  • 如果你在foo里面定义了std::function,那么递归函数在它外面是不可重用的。这很好,如果它无论如何都不可重复使用。
  • 不适用于 c++11 之前的标准。

哪个更好取决于你需要什么和你喜欢什么。在大多数情况下,我更喜欢简单的功能。