如何:包含其基类派生对象的容器的模板类

How to: Template class that contains container of it's base class derived objects

提问人:mgampi 提问时间:12/15/2022 更新时间:12/15/2022 访问量:40

问:

我想建立一个模板类模型,该模型的结构是存在一个基本模板,而基模板又将作为 std::unordered_map 中的对象存储在派生模板类中。 每个对象都有一个唯一的键,该键可以是不同的数据类型(POD、struct 等)。 我不知道如何告诉派生的容器类将传递的子类的键类型用于unordered_map的键。具体而言,如果对象是从基类派生的,然后由于专用化而不再是模板类。

到目前为止,我做了什么:

   **  // The base class**
   template <typename IDType> class XRObject {
   public:
    XRObject() : ID_() {
    }

    XRObject( const IDType& id) : 
    ID_(id){
    }

    XRObject(const XRObject& other) : ID_(other.ID_)
    {
    }

    virtual ~XRObject() = default;

    IDType getID() const {
      return ID_;
    }
    void setID(const IDType& id) {
      ID_= id;
    };

  private:
    IDType  ID_;
  };


  // The derived container class
  template <class IDType=long, class T=XRObject> class XRObjectContainer : public XRObject<IDType> {
  public:

    using ptr_type = typename std::shared_ptr<T>;
    using container_type = typename std::unordered_map<**IDType of class T**, ptr_type>;

    using iterator = typename container_type::iterator;
    using const_iterator = typename container_type::const_iterator;

    using sorted_containter_type = typename std::multimap<std::wstring, **IDType of class T**>;
    using sorted_iterator = typename sorted_containter_type::const_iterator;

    XRObjectContainer() : XRObject<IDType>() {
    }

    XRObjectContainer(IDType id) {
    }

    XRObjectContainer(const XRObjectContainer& rhs) : XRObject<IDType>(rhs) {
    }

  protected:
    container_type         children_;
    sorted_containter_type sortedbyname_;
  };

  // Concrete class specialisation
  class XRUnit : public XRObject {
  public:

    XRUnit::XRUnit() : XRObjectContainer<long, XRUnit>(), Factor_(0.0, true) {
    }

    XRUnit::XRUnit(long id, double Factor) : XRObjectContainer<long, XRUnit>(id),
      Factor_(Factor) {

    }

  private:
    XRValue<double>     Factor_;

  };

  // The final container class using XRUnit as data members of the internal unordered_map container
  class XRUnits : public XRObjectContainer<std::string, XRUnit> {
  public:

    XRUnits::XRUnits() : XRObjectContainer<std::string, XRUnit>() {
    }

    XRUnits::XRUnits(const std::string& ID) : XRObjectContainer<std::string, XRUnit>(ID) {
    }

  };

我不知道如何让编译器自动确定类 XRUnit 的 IDType 并在模板类 XRUnits 中用作其 std::unordered_map 成员的键类型?XRObjectType 派生类的 IDType 从包含的unordered_map元素 IDType 的 IDType 延迟。

C++ 模板 继承 类型名称

评论


答: 暂无答案