2012-12-14 69 views
2

如果我有這個類函數包裝器初始化在C++ 11中如何工作?

class TextBox : public Widget { 
public: 
    void addKeyPressHandler(std::function<void (std::string)>); 
private: 
    std::function<void (std::string)> keyPressHandler; 
}; 

我怎麼知道,如果keyPressHandler已設置或不?我可以將它初始化爲NULL,然後測試它嗎?

+0

這有什麼好做的lambda表達式,它看起來像這樣:'[...](... ){...}'。這是一個*函數包裝*。 – GManNickG

回答

3

std::function允許您通過其operator bool()測試它是否包含可調用目標。

例如:

if (keyPressHandler) 
{ 
    keyPressHandler(someString); 
} 
else 
    // TODO: Consider queuing events here if you don't want to miss keystrokes. 
} 

...將調用的函數,只有當它有一個有效的目標。意思是它已經被分配了一個函數指針,或者其他可被調用的函數,因爲它已被初始化。

+0

uhmm ...如果我有很多'std :: functions'或者多次調用這個函數,如果我用空的lambda表達式初始化它們而不是一遍又一遍地檢查它會不會有效? – mr5

4

可以使用operator bool成員函數

20.8.11.2.3功能容量[func.wrap.func.cap]

explicit operator bool() const noexcept;

返回:如果*這款擁有目標,否則爲 錯誤。

#include <iostream> 
#include <functional> 
int 
main() 
{ 
     std::function<void()> f; 

     std::cout << (bool) f << std::endl; 

     f = [](){}; 
     std::cout << (bool) f << std::endl; 
} 
1

您可以在布爾環境測試(如其他答案狀態)

if (keyPressHandler) 
    ... 

,或者你可以對nullptr

if (keyPressHandler != nullptr) 
    ... 

當然仰視進行比較你自己的文檔會比問一個問題並等待答案更快。這是從文檔肖恩克萊因鏈接,以記錄了operator bool()很明顯的「檢查是否有效的目標包含」