2011-03-18 20 views
3

有什麼辦法可以給C++帶來一些函數式編程,我想把一些LAMBDA函數或者運算符作爲參數傳遞給另一個函數。有沒有一些方法可以提供一些函數或運算符作爲參數?

例如:

void test(DWORD foo) 
{ 
    try { __asm { call foo; } } // very weird way, don't think that could work 
    catch (...) {() } 
} 

或:

void test2(DWORD foo) 
{ 
    someconnection.Open(); 
    __asm { call foo; } // very weird way, don't think that could work 
    someconnection.Close(); 
} 

和用法一樣:

int main() 
{ 
    ... 
    dosomething(); 
    ... 
    void operator()(int n) // lambda expression, not sure if that correct way creating them 
    { 
    dosomething(); 
    dosomethingelse(); 
    } 
    test (*operator(5)) // here is what I want 
    test2 (*operator(10)) // here is what I want 
    ... 
    dosomethingelse(); 
    ... 
} 

我使用Visual Studio 2010和不知道如果我可以用C + + 0x那裏,但我可以使用提升,如果這可以做我想做的事情。

那麼有什麼方法可以做到嗎?

+5

谷歌函數指針和增強::函數 – Patrick 2011-03-18 13:10:38

回答

7

可以通過使參數例如是test一個std::tr1::function

void test(std::tr1::function<void(DWORD)> func) { 
    func(0); 
} 

你可以用一個函數,一個成員函數或甚至拉姆達稱之爲:

test([](DWORD param) { return; }); 
+0

呃,在你的最後一個例子中有一個不匹配的括號。 – 2011-03-18 13:15:04

+0

@ Space_C0wb0y:我忘記了'function'的'void'返回類型太快了。謝謝。 – Jon 2011-03-18 13:16:23

+2

注意:由於這是標記爲C++ 0x,因此不需要'tr1'命名空間。 – 2011-03-18 13:19:30

0

這裏有大量的stuff in boost

但是,我通常建議不要太深入它。問題在於,像lambdas這樣的東西在推動中的實現變得非常複雜。我已經看到與VS編譯需要幾分鐘的時間來處理單個源文件,如果你做錯了什麼,你會得到ludicrously long unreadable error messages

嗯,實際上這些消息是可讀的,但前提是您非常熟悉所有涉及的boost對象的實現。恕我直言,設施的客戶不應該非常瞭解設施如何編碼以使用它的內部。

相關問題