c++ - C ++不能使用从父对象到对象的动态转换来存储向量内的元素
问题描述
我有一个我已经实现的不同类型的渲染器类的列表,我想存储在 a 中std::vector<BaseRenderer>
,然后创建一个方法来根据它的实际类检索对象,我创建了以下方法来添加和检索对象从所述向量。
// appends a new renderer instance to the vector
template<typename _tRenderer>
inline typename std::enable_if<std::is_base_of<BaseRenderer, _tRenderer>::value, void>::type addRenderer(_tRenderer &renderer) {
renderers_.emplace_back(std::move(renderer));
}
检索实例的代码如下
template<typename _tRenderer>
inline typename std::enable_if<std::is_base_of<BaseRenderer, _tRenderer>::value, _tRenderer>::type getRenderer() {
auto it = std::find_if(renderers_.begin(), renderers_.end(), [](BaseRenderer &r) -> bool { return dynamic_cast<_tRenderer *>(&r) != nullptr; });
assert(it != renderers_.end() && "No renderer instance with the requested type was registered in this context");
return *dynamic_cast<_tRenderer *>(&(*it));
}
为了测试这一点,我添加了一个 TextRenderer 并尝试使用后一种方法来获取相同的对象
context.addRenderer(TextRenderer());
auto tr = context.getRenderer<TextRenderer>();
它在断言阶段失败,因为该方法无法在任何已注册的实例上执行 dynamic_cast,除了将指针保存在向量中而不是完整实例之外,我想不出为什么它不是的原因这是我宁愿不做的事情。
非常感谢为实现这一目标提供一些帮助,因为在我正在研究的库中实现这种机制会非常好。提前致谢。
解决方案
推荐阅读
- discord - 如何在 discord.js 中获得我的 Bot 角色?
- dynamic - 如何将动态误差添加到测量中
- laravel - Larave 点播通知通道
- dart - 为什么DART async 修改方法await 之前的代码是同步的?
- linux - 如何在 Linux 系统上设置 Neo4j 引导程序?
- php - Wordpress 与 Mysql5.7 在 RDS aurora 上的持久连接
- javascript - 任何setpixel示例?
- angular - 由于 Angular Karma Jasmine 测试结果,在测试中看不到我的组件
- java - 使用 java8 流从另一个列表创建对象列表
- html - 从页脚打开一个链接,该链接打开一个显示特定菜单选项卡的页面