2017-04-11 46 views
2

想想這段代碼在C/C++:c + +創建一個類似而功能,如果,或

bool cond = true; 
while(cond){ 
    std::cout << "cond is currently true!"; 
} 

是否有可能創建一個可以這樣調用函數?

myFunction(some_parameters_here){ 
    //Code to execute, maybe use it for callbacks 
    myOtherFunction(); 
    anotherFunction(); 
} 

我知道你可以使用函數指針和lambda函數,但我想知道你是否可以。我很確定有一種方法可以這樣做,因爲while()如何存在?

+5

「while」不是函數,而是語言的一部分。你不能用相同的語法創建一個函數,但是你可以用lambda來做類似的事情,就像你說的那樣。 – interjay

+0

我不確定你在說什麼。你的意思是一個像'while'一樣的函數嗎?通常你會'while(myFunction(args))'。較新版本的C++有'lambda',但我不確定這是否可行。它可以使非常複雜的代碼。 – tadman

+0

你可以用宏來僞裝它。取決於你希望'myFunction'做什麼。 –

回答

3

while(condition) { expression }不是一個函數,而是一個控制結構/一個單獨的語言結構;只要condition評估爲true(即!= 0),它就一次又一次地執行expression

形式void myFunction(int someParameter) { expression }的函數定義,相反,只有當它被另一個函數調用時纔會執行。

希望它有一點幫助;

+0

我不太清楚這是如何回答這個問題的,儘管它確實清楚了'while'不是函數。但顯然它確實如此。 – Quentin

3

注意:此解決方案無法保證您的代碼審閱者會喜歡它。

我們可以使用一個類似於Alexandrescu的一招用於他SCOPE_EXIT macro(真棒一個小時的會議,該位爲18:00)。

它的要點:一個聰明的宏和一個肢解的lambda。

namespace myFunction_detail { 
    struct Header { 
     // Data from the construct's header 
    }; 

    template <class F> 
    void operator * (Header &&header, F &&body) { 
     // Do something with the header and the body 
    } 
} 

#define myPrefix_myFunction(a, b, c) \ 
    myFunction_detail::Header{a, b, c} * [&] 

使用它,如下所示:

myPrefix_myFunction(foo, bar, baz) { 

}; // Yes, we need the semicolon because the whole thing is a single statement :/ 

...復溶宏展開後,一個完整的λ和土地成myFunction_detail::operator*與接取foobarbaz和結構體。