मैंने इसे std :: function और std :: bind के साथ किया।
मैंने इस EventManager वर्ग को लिखा है जो एक unordered_map में हैंडलर के वेक्टर को संग्रहीत करता है जो कि इवेंट प्रकार (जो कि अभी अहस्ताक्षरित int हैं, मेरे पास उनका एक बड़ा नाम-स्कोप्ड एनम है) उस इवेंट प्रकार के हैंडलर के वेक्टर के लिए है।
मेरे EventManagerTests वर्ग में, मैंने एक इवेंट हैंडलर सेट किया, जैसे:
auto delegate = std::bind(&EventManagerTests::OnKeyDown, this, std::placeholders::_1);
event_manager.AddEventListener(kEventKeyDown, delegate);
यहां AddEventListener फ़ंक्शन है:
std::vector<EventHandler>::iterator EventManager::AddEventListener(EventType _event_type, EventHandler _handler)
{
if (listeners_.count(_event_type) == 0)
{
listeners_.emplace(_event_type, new std::vector<EventHandler>());
}
std::vector<EventHandler>::iterator it = listeners_[_event_type]->end();
listeners_[_event_type]->push_back(_handler);
return it;
}
यहाँ EventHandler प्रकार की परिभाषा है:
typedef std::function<void(Event *)> EventHandler;
तब EventManagerTests में वापस :: RaiseEvent, मैं यह करता हूं:
Engine::KeyDownEvent event(39);
event_manager.RaiseEvent(1, (Engine::Event*) & event);
यहाँ EventManager के लिए कोड है :: RaiseEvent:
void EventManager::RaiseEvent(EventType _event_type, Event * _event)
{
if (listeners_.count(_event_type) > 0)
{
std::vector<EventHandler> * vec = listeners_[_event_type];
std::for_each(
begin(*vec),
end(*vec),
[_event](EventHandler handler) mutable
{
(handler)(_event);
}
);
}
}
यह काम। मुझे EventManagerTests में कॉल मिलता है :: OnKeyDown। मुझे हटाने के लिए वैक्टर को समय पर साफ करना पड़ता है, लेकिन एक बार जब मैं करता हूं कि कोई लीक नहीं है। एक घटना को उठाते हुए मेरे कंप्यूटर पर लगभग 5 माइक्रोसेकंड होते हैं, जो कि 2008 है। यह बिल्कुल सुपर फास्ट नहीं है, लेकिन। जब तक मुझे पता है कि मैं काफी गर्म हूं और मैं अल्ट्रा हॉट कोड में इसका इस्तेमाल नहीं करता हूं।
मैं अपने स्वयं के std :: function और std :: bind को रोल करके इसे गति देना चाहूंगा, और शायद वैक्टरों के unordered_map के बजाय सरणियों के एक सरणी का उपयोग कर सकता हूं, लेकिन मुझे यह पता नहीं चला है कि सदस्य फ़ंक्शन को कैसे संग्रहीत किया जाए पॉइंटर और उसे कोड से कॉल करें जो कि वर्ग को बुलाए जाने के बारे में कुछ नहीं जानता है। बरौनी का जवाब बहुत दिलचस्प लगता है ।।