2013-10-12 47 views
2

我已經寫了一個event類模板dessigned提供C#風格的事件:事件實例存儲爲類的公共成員,以提供不同的事件給所有者類。例如:最優雅的方式來包裝類內的freeglut回調

template<typename SENDER , typename ARGS> 
class event{ .... }; 

struct foo 
{ 
    event<foo,int> event_a; 
    ... 

    void do_work() 
    { 
     int data; 

     .... 

     event_a.raise_event(*this , a); 
    } 
}; 

void on_event_a(foo& , int&) { std::cout << "On event_a of class foo!" << std::endl; } 

struct bar 
{ 
    void on_event_a(int&) { std::cout << "Catching an event with a member function!"; } 
}; 


int main() 
{ 
    int argumment; 

    foo foo_instance; 
    bar bar_instance; 

    foo.event_a.add_handler([](foo& , int&) { std::cout << "Lambda!" << std::endl; }); 
    foo.event_a.add_handler(on_event_a); 
    foo.event_a.add_handler(bar_instance , &bar::on_event_a); 

    foo_instance.do_work(); 
} 

輸出是:

LAMBDA!
在foo類的event_a上!
用會員功能捕捉事件!

現在我想用這種機制來將Freeglut換成OO風格。具體而言,我不想寫一個負責管理不同Freeglut事件(窗口大小調整,鍵盤輸入,鼠標移動等)的類。
我的第一個想法是使用類的構造函數來註冊每個freeglut回調一個拉姆達,和拉姆達繞過回調argumments到appropiated事件,像這樣:

class freeglut_events 
{ 
    event<freeglut_events> repaint_event; 

    freeglut_events() 
    { 
     glutDisplayFunc([&](){ repaint_event.raise_event(*this); });     
    } 
}; 

但是,這導致了以下編譯器錯誤(我使用Visual Studio 2012):

沒有來自有效的轉換 '[]拉姆達() - >無效' 到 '無效(*)()'

什麼我明白是t他註冊函數所期望的全局函數指針的簽名和lambda的簽名並不完全相等,因爲lambda捕獲本地數據。

我的問題是:是否有任何其他優雅的方式來實現這一目標?

+1

爲[這裏解釋(http://stackoverflow.com/a/18889029)轉換爲一個函數指針(因此'+'招)僅適用於* *不捕獲** lambda。 –

+0

@DanielFrey感謝您的信息,我沒有考慮過。有其他選擇嗎? – Manu343726

+0

恐怕不是。 –

回答