我已經寫了一個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捕獲本地數據。
我的問題是:是否有任何其他優雅的方式來實現這一目標?
爲[這裏解釋(http://stackoverflow.com/a/18889029)轉換爲一個函數指針(因此'+'招)僅適用於* *不捕獲** lambda。 –
@DanielFrey感謝您的信息,我沒有考慮過。有其他選擇嗎? – Manu343726
恐怕不是。 –