2017-07-08 79 views
2

我不知道是否有可能在C++中做到這一點?如何將函數設置爲變量並從中調用?

e.g:

varFunction = void TestFunction(); 
RunCode(varFunction); 
+2

請說明您的具體問題或添加額外的細節,突顯你需要什麼。正如它目前所寫,很難確切地說出你在問什麼。請參閱[如何提問](https://stackoverflow.com/help/how-to-ask)頁面以獲得澄清此問題的幫助。 – cpplearner

+1

你正在尋找的是[函數指針](http://www.cprogramming.com/tutorial/function-pointers.html)。 如果你的函數也可能是lambda函數,函子或其他有狀態的結構,['std :: function'](http://de.cppreference.com/w/cpp/utility/functional/function)是要走的路。 –

+3

考慮閱讀[良好的C++書](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –

回答

3

C++提供了幾種方法來做到這一點。

例如,你可以使用std::function模板:包括<functional>並使用下面的語法(demo):

std::function<void()> varFunction(TestFunction); 
varFunction(); 

你也可以使用函數指針(Q&A on the topic)。

5

使用C++ 11及更高版本,可以使用std::function來存儲函數指針和函數對象。

但是存儲function pointers從一開始就在C++中可用。這意味着您可以存儲函數的地址並稍後調用它。

BTW,lambda expressions也非常有用(和它們的表示可以closure分配或std::function -s通過)


這裏是在三種不同的方式來實現你剛纔問的一個例子:

#include <iostream> 
#include <functional> 

void RunCode(const std::function<void()>& callable) { 
    callable(); 
} 

void TestFunction() { 
    std::cout << "TestFunction is called..." << std::endl; 
} 

int main() { 
    std::function<void()> varFunction_1 = TestFunction; 
    void (*varFunction_2)() = TestFunction; 

    RunCode(varFunction_1); 
    RunCode(varFunction_2); 
    RunCode([]() { std::cout << "TestLambda is called..." << std::endl; }); 

    return 0; 
} 

但是,這是冰山的一角,傳遞函數指針和函數對象作爲參數在algorithms library很常見的。

+0

繼承自C,我認爲。你可以在C中做類似的事情。 –

+0

C還沒有任何lambda表達式或閉包的概念(但在未來的C20標準中可能會改變)。這要求編譯器計算一組關閉值(以lambda表示)。 –

+0

@TomZych,是的。函數指針也用於C中。 – Akira

1

爲了完整起見,你可以聲明如下C風格的功能類型:

typedef int (*inttoint)(int); 

這將創建一個類型inttoint可存儲需要一個int參數,並返回一個int的任何功能。你可以按如下方式使用它。

// Define a function 
int square(int x) { return x*x; } 

// Save the function in sq variable 
inttoint sq { square }; 

// Execute the function 
sq(4); 

由於C++ 11,這些變量也可以存儲lambda函數,像這樣

inttoint half { [](int x) { return x/2; } }; 

並且如上所述一樣使用它。

0

最簡單的方法是使用lambda表達式是這樣的:

auto add = [](int a, int b) { return a+b; }; 
cout << add(10, 20) << endl; // Output: 30 

更多信息有關如何lambda表達式工作:http://en.cppreference.com/w/cpp/language/lambda

相關問題