作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个事件系统,该系统允许触发器将事件发送到单个处理程序或与给定类型关联的所有处理程序。前者是基本的 map 功能,后者最符合要求……除非你想要多态行为。
class Parent {};
class Child : public Parent {};
// ...
Parent p; Child c;
Trigger trigger;
Handler h1(&p), h2(&c);
trigger.sendToType<Child>(Event()); // sends the event to h2; OK
trigger.sendToType<Parent>(Event()); // sends the event to h1 only; NO
处理程序是根据创建时使用的指针类型进行注册的。 h1
的“类型”是Parent
,h2
的“类型”是Child
。使用调度程序中使用的基本类型 ID 映射(只是一些类型关联的整数映射到 Handler*
的 vector ),在发送给 parent 时无法将事件发送给 child 。
我能想到的唯一解决方案有几个缺点:
理想情况下,我想要一个解决方案,其中每次发送到类型的开销减少到(子级数 + 1 个实际类型)查找,但这可能是不可能的。有什么建议吗?
最佳答案
最简单的解决方案是使用 dynamic_cast。可能它在性能方面不是最优的,但应该比 map/hash 更快
Here is implementation - test online
#include <iostream>
#include <string>
#include <vector>
struct Event
{
std::string what;
};
class Parent
{
public:
virtual void process(const Event& e)
{
std::cout << e.what << "Parent" << std::endl;
}
};
class Child : public Parent
{
public:
virtual void process(const Event& e) override
{
std::cout << e.what << "Child" << std::endl;
}
};
template<typename T>
void handler(Parent* obj, const Event& e)
{
if (T* tmp = dynamic_cast<T*>(obj))
tmp->process(e);
}
template<typename T, typename PARENT>
std::vector<T*> select_objects(const std::vector<PARENT*>& objects)
{
std::vector<T*> res;
for (auto obj : objects)
{
if (T* tmp = dynamic_cast<T*>(obj))
res.push_back(tmp);
}
return res;
}
int main()
{
std::vector<Parent*> objects = {new Parent, new Child};
Event e{"Hello from "};
std::cout << "All objects" << std::endl;
for (auto p : objects)
handler<Parent>(p, e);
std::cout << "Child objects only" << std::endl;
for (auto p : objects)
handler<Child>(p, e);
// here we can build an index to access objects faster
std::cout << "Child objects only using select" << std::endl;
std::vector<Child*> children = select_objects<Child>(objects);
for (auto o : children)
o->process(e);
}
输出:
All objects
Hello from Parent
Hello from Child
Child objects only
Hello from Child
Child objects only using select
Hello from Child
更新:您可以建立一些索引来更快地访问对象
关于c++ - 使用多态检索实现类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060436/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!