我一直在設計一個庫。其中一個方面將是EventManager
。C++設計事件處理程序類
到目前爲止,設計是這樣的:
Client client
client.on(string, function);
其中string是std::string
和功能是std::function<void()>
client.on
的定義是這樣的:
void Client::on(const std::string& name, const std::function<void()>& function) {
_eventManager->add(string, function);
}
而且_eventManager->add(string, function)
唯一目的是創造一個名爲Event
的結構,並將名稱和函數存儲在該結構中,然後將新的支柱推到一個矢量上。現在
我可以做一些類似的: _eventManager->emit("test");
然後它會循環的載體陣列和發現任何event.name
等於當你叫emit
和運行結構中的功能,您使用的名稱。
這一切工作,是非常偉大的,真棒和所有,但它不完全是我所需要的,將無法正常工作,因爲我需要發送第二個參數與_eventManager->emit()
。第二個參數是未知的,很可能不是未知數,但它可以是基於您在第一個參數中輸入的字符串的多種數據類型。
用法示例:
Client client();
client.on("ready", [](User user) {
user.test();
});
User user;
_eventManager->emit("ready", user); //I know this does not exists but it is nearly an example.
client.on("message_created", [](Message message) {
std::cout << message << std::endl; //Operator overload here
}
Message message("Something to print");
_eventManager->emit("message_created", message));
我想過使用boost::variant
允許多種類型是允許被傳遞,但是你必須通過做一些像這樣的函數中對它們進行檢索。
client.on("ready", [](boost::variant<User, Message> args){
User user = boost::get<User>(args);
});
而且它假設是太簡單,我寧可不要使用強制使用boost::get
所有事件中檢索獲得通過該類庫中的人。
這就是說,有了上面所有的精彩信息,我想做什麼又是另一種選擇?關於爲什麼我應該或不應該做我在做什麼的任何建議?
這花了我很長時間才寫出來,所以先進的謝謝,我希望這一切都有意義。
爲什麼不使用像[Qt的(https://www.qt.io)現有的庫,[SFML(https://開頭WWW .sfml-dev.org),[gtk](https://www.gtk.org)或類似的?爲什麼要經歷重塑車輪的痛苦? –
你的'on'函數模板知道回調接受的參數類型。它可以實例化一箇中間thunk,它接受一個變體,提取期望的類型,並且(如果成功)調用原始回調。 – Useless