আমি স্ট্যান্ড :: ফাংশন এবং স্ট্যান্ড :: বাইন্ড দিয়ে এটি করেছি
আমি এই ইভেন্ট ম্যানেজার ক্লাসটি লিখেছি যা একটি নিয়ন্ত্রিত_ম্যাপে হ্যান্ডলারের একটি ভেক্টর সঞ্চয় করে যা ইভেন্টের ধরণের মানচিত্র (যা কেবল স্বাক্ষরবিহীন অন্তর্নিহিত, আমার একটি বড় নেমস্পেস-স্কোপড এনাম আছে) ইভেন্টের ধরণের হ্যান্ডলারের কাছে।
আমার ইভেন্ট ম্যানেজার টেস্ট ক্লাসে, আমি এইভাবে একটি ইভেন্ট হ্যান্ডলার সেট আপ করেছি:
auto delegate = std::bind(&EventManagerTests::OnKeyDown, this, std::placeholders::_1);
event_manager.AddEventListener(kEventKeyDown, delegate);
এখানে অ্যাডএভেন্টলিস্টনার ফাংশনটি রয়েছে:
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;
}
এখানে ইভেন্টহ্যান্ডলার ধরণের সংজ্ঞা রয়েছে:
typedef std::function<void(Event *)> EventHandler;
তারপরে ইভেন্ট ম্যানেজার টেস্টগুলিতে ফিরে :: রাইসইভেন্ট, আমি এটি করি:
Engine::KeyDownEvent event(39);
event_manager.RaiseEvent(1, (Engine::Event*) & event);
ইভেন্ট ম্যানেজারের জন্য এখানে কোড :: উত্থাপন:
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);
}
);
}
}
এইটা কাজ করে. আমি ইভেন্ট ম্যানেজার টেস্টস :: ওনকিডাউন-এ কল পেয়েছি। আমাকে ভেক্টরগুলি মুছে ফেলতে হবে সময় পরিষ্কার করতে, তবে একবার আমি এটি করি যে কোনও ফাঁস নেই। একটি ইভেন্ট উত্থাপন করতে আমার কম্পিউটারে প্রায় 5 টি মাইক্রোসেকেন্ড লাগে, যা প্রায় ২০০ 2008 সালে। যতক্ষণ না আমি জানি এটি যথেষ্ট উপযুক্ত এবং আমি এটি অতি হট কোডে ব্যবহার করি না।
আমি আমার নিজস্ব স্টাডি :: ফাংশন এবং এসটিডি :: বাইন্ডটি ঘূর্ণায়মান করে এবং সম্ভবত ভেক্টরগুলির আনর্ডার্ড_ম্যাপের চেয়ে অ্যারে ব্যবহার করে এটিকে দ্রুত করতে চাই, তবে সদস্য ফাংশন কীভাবে সংরক্ষণ করব তা আমি খুব একটা বুঝতে পারি নি পয়েন্টার এবং কোড থেকে কল করুন যা ক্লাস বলা হচ্ছে সম্পর্কে কিছুই জানে না। আইল্যাশের উত্তর খুব আকর্ষণীয় দেখাচ্ছে ..