2014-11-25 123 views
0

我發現自己處於需要將函數作爲參數傳遞給另一個函數的情況。作爲參數的函數

int callSomeFunction(int &func){ 
    func(); 
} 

如果有區別,callSomeFunction是一個類成員。

class A{ 
    A(){} 
    int callSomeFunction(int &func){ 
    func(); 
    } 
    ~A(){} 
}; 
A a(); 
a.callSomeFunction(func); 

理想的情況下,callSomeFunction將能夠採取任何形式的功能。

template<typename T> 
T callSomeFunction(T &func){ 
    func(); 
} 

我已經嘗試了很多事情來做到這一點,搜索了幾個小時,所有的標準的東西。我發現這些東西,但發現他們沒有結果,至於最好的方式來完成這一點,或更合適的是最有效的。

Resource 1

Resource 2

我喜歡過的指針使用引用在適用情況下,主要是因爲它們不是存儲混亂,也沒有任何情況下,語法一塌糊塗。但是,如果指針更適用或更好的解決方案,我也歡迎這些答案。 謝謝,如果你認爲它可以幫助其他人,任何幫助或指導如何改善這個問題,也表示讚賞。

+1

讓我們看看你已經嘗試什麼,以及爲什麼它沒有在你的第二個片段的最後一行的工作 – quantdev 2014-11-25 01:52:13

+0

你也不會從那裏你把'func'顯示。當你將'int&func'聲明爲一個參數時,在我看來,對於一個int的正常引用,而不是一個函數指針...你不是在這裏和那裏丟失括號嗎? – MondKin 2014-11-25 02:11:38

+0

@quantdev,上面的代碼是我試過的,上面的符號是應該發生的,但我不知道*爲什麼*它不起作用。編譯器錯誤指向語法,並且我知道函數指針,這似乎是解決這個問題的方法。我的問題是問最好的方法是什麼,而不是「我做錯了什麼?」 – PyroAVR 2014-11-25 22:49:49

回答

0

這是 C++ - IC的方式來做到這一點:(C++需要一個「Python化」)

標準庫包括<functional>,報頭允許您輕鬆做到這一點。 首先,必須包括<functional>,其提供std::functionstd::placeholdersstd::bind

一個function具有以下定義: std::function<returntype(arg1type, argNtype)> f; 不幸的是,你的類或包裝功能不能採取任何形式的功能,你需要知道要麼返回類型或參數類型,或兩者的任何功能,要使用。我建議重新定義所需的函數void返回類型,並在函數的輸出結尾添加一個額外參數,類似於C中的strcat通過將第一個參數設置爲等於它自己和第二個參數來工作。

void myFunction(int *arg1, float *arg2, float *returnType)

這可能需要在它之外定義的函數並執行它可能看起來像這樣一類:

template<typename F> 
class FunctionWrapper { 
    std::function<void(F)> f; //return type(argument type) 
    public: 
    FunctionWrapper(std::function<void(F)> _f) { 
    f = std::bind(_f, std::placeholders::_1); //makes f equal to _f, and does not specify an argument 
    } 
    void runFunc(F arg) { //Now send the arguments 
    f(arg); 
    } 
}; 

bind...該生產線是最關鍵的。 std::bindstd::function定義爲另一個函數,並且可以以std::placeholders::_N的形式給出參數佔位符。佔位符滿足它們的同名,它們允許程序員將函數與未指定類型和位置/值的參數綁定。 std::bind也可用於通過提前將某些參數提供爲常量來簡化功能,使其在未來更易於使用。 即:

std::function<int(int,int,int)> simpleFunction; 
simpleFunction = std::bind(rgbToHex(255, 127, std::placeholders::_1); 
simpleFunction(153); 

現在,程序員只需指定藍色成分。

我希望這可以幫助任何人也有這個問題!我需要它爲即將到來的遊戲編寫一個狀態機類...請詢問您可能有的任何問題,如果需要,我會澄清我的答案!

0

C++ 11支持函數指針,使得以下是有效的:

int foo() 
{ 
} 

int goo() 
{ 
} 

int main() 
{ 
    int (*pFoo)() = foo; // pFoo points to function foo() 
    pFoo = goo; // pFoo now points to function goo() 
    return 0; 
} 

因此,對於你的情況,你可以通過函數指針(pFoo在這個例子中)。

信用代碼:http://www.learncpp.com/cpp-tutorial/78-function-pointers/

+0

函數指針從C89和C++ 98開始可用,直到C++ 11 – 2014-12-04 04:42:23

+0

謝謝!然而,儘管這確實是最簡單的方法,但我仍然需要將函數指針(更準確地說是它們的映射)存儲在事先無法知道函數類型的類中,因此我使用上面的'std :: function'。 – PyroAVR 2014-12-05 11:43:25