2015-12-21 91 views
1

假设我的类有一个方法必须从其中调用其他递归方法。递归std :: functional与递归匿名命名空间函数。哪一个使用?

我.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,这可以吗?

+0

第二个例子甚至编译?为什么你想要创建一个额外的推理层?我没有得到你问题的*点*。 – YSC

+0

@YSC大概这不是什么都没有:从所说的东西中引用了一个private-to-something函数。 – user2864740

+1

@YSC无论如何,wrt递归lambdas:http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c11,http://stackoverflow.com/questions/14531993/can-lambda-functions-be -recursive – user2864740

回答

2

std::function优点:

  • 如果递归函数只从该函数调用,那么它的范围是有限的好。匿名命名空间对整个翻译单元可见。这个功能对于其他的翻译单元是可见的,所以这可能只是一个小小的优势。

std::function缺点:

  • 一个简单的函数具有比拉姆达简单的语法。
  • std::function可能有some small overhead
  • 如果您在foo中定义std::function,那么递归函数在其外部不可重用。这很好,如果它不能重复使用。
  • 不适用于pre-C++ 11标准。

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

2

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

大概你可以控制你的班级实施,你不会在没有理由的情况下打电话给myRecursiveFunction()。这适用于所有功能:你会拨打abort()你不应该在哪里?尽管全班同学可以使用它。

使用递归本地lambda只添加了一层推理,并使代码更复杂的阅读。如果这是您的程序的时间评估程序部分,则可以使用std::function使其变慢。