首页 > 解决方案 > 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,除了将指针保存在向量中而不是完整实例之外,我想不出为什么它不是的原因这是我宁愿不做的事情。

非常感谢为实现这一目标提供一些帮助,因为在我正在研究的库中实现这种机制会非常好。提前致谢。

标签: c++templatesstdvectordynamic-cast

解决方案


推荐阅读