2015-12-21 79 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使其變慢。