2016-07-22 72 views
1

我寫了一個Event類作爲回調函數的包裝,實現爲std::function s。這是什麼樣子:C++ std ::函數作爲函子的參數

class Event 
{ 
public: 
    Event() : default_handler([]() {}); 
    Event(const std::function<void()> handler) : default_handler(handler); 

    void SetHandler(std::function<void()> handler) 
    { 
     custom_handler = handler; 
    } 

    void operator()(void) 
    { 
     default_handler(); 
     custom_handler(); 
    } 

private: 
    const std::function<void()> default_handler; 
    std::function<void()> custom_handler; 
}; 

然後,另一個類中,我有一個事件的一個實例:

class Control 
{ 
public: 
    Control(); 

//Should call constructor Event() 
    Event myEvent1; 
//Should call constructor Event(std::function<void()>) 
    Event myEvent2([]() {/*do stuff... */}) 
}; 

然而,這不會對VC++編譯,生成錯誤C3646(未知覆蓋說明符)和錯誤C4430(缺少類型說明符 - int假定),這兩個處理程序的myEvent2語法錯誤更多。我哪裏做錯了?

+5

將來,發佈實際的錯誤。儘管你可能不瞭解他們,但他們實際上有有用的信息! – Yakk

回答

1

你應該使用{}語法:

Event myEvent2{[]() {/*do stuff... */}}; 

Demo

至於語法default member initializer

member = value; 

member{value}; 

但不是

member(value); // Invalid syntax 
+6

你能解釋一下爲什麼*? – Borgleader

+1

@erip:與類型擦除無關,但允許使用允許的語法來設置默認成員初始值設定項。見[data_members_initialization](http://en.cppreference.com/w/cpp/language/data_members#member_initialization) – Jarod42

+0

@Borgleader:發佈編輯添加一點解釋。 – Jarod42

2

當你寫

Event myEvent2([]() {/*do stuff... */}); 

編譯器將myEvent2作爲成員函數,而不是構造函數的調用。