2016-11-11 19 views
0

我有一個功能,讓我們說同時接受拉姆達函數和函數指針作爲參數

void processSomething(Arg1 arg1, Function t){ 
    ... 
    t(someVariable); 
} 

我想以下兩個用途的工作:

processSomething(myArg1, [&](SomeVariable someVar){...}); 
void(*myFunc)(void) = &someFunc; 
processSomething(myArg1, myFunc); 

然而,我發現,當使用void(*myFunc)(void)作爲參數聲明時,我不能使用lambda-way。 任何方式使兩種用法工作沒有兩個單獨的功能或過度複雜的使用包裝?

+0

如果你看看例如[標準算法函數](http://en.cppreference.com/w/cpp/algorithm),您將看到所有采用「謂詞」的函數都會將其作爲模板類型。 –

回答

6

好了,你有兩個選擇:

  1. 模板:

    template<class F> 
    void processSomething(Arg1 arg1, F t){ 
    

    這是首選方法,因爲它創造更高效的代碼,但在可能的代碼複製的成本。

  2. 使用std::function或這樣的:

    void processSomething(Arg1 arg1, std::function<void(SomeVariable)> t){ 
    

    有一個運行時的成本所涉及的間接性,但它會使用相同的代碼在每種情況下。

+0

太棒了,非常感謝。 – user2065501