为存储在向量或向量中的派生类对象创建模板API

Creating a template API for derived class objects stored in a vector or vectors

本文关键字:向量 创建 对象 建模 API 存储 派生      更新时间:2023-10-16

我想创建一个模板的API来访问存储在向量向量中的派生类型。外部向量具有每种派生类型的元素。内部向量有这些类型的集合。

std::vector<std::vector<MyBaseClass>* > items;

理想情况下,我想提供一个API,可以在其中添加和访问派生类型的Mybaseclass类型(没有专门模板)。这样的东西:

T& addItem(size_t index, T& item);
T& getItem(size_t index);

这样使用:

AClass : public MyBaseClass {};
BClass : public MyBaseClass {};
addItem<AClass&>(123, item);
addItem<BClass&>(456, item);
AClass& = getItem<AClass&>(123);
BClass& = getItem<BClass&>(456);

缺乏专业模板的原因是,我想启用新的派生类型,而无需其他开发人员必须修改此代码。

因此,有没有办法可以实现这种API,而不必知道派生类型并专业化代码?

是否可以使用联合和模板进行此操作?

注意:内部向量需要连续存储其数据,因此我不使用指针。

NOTE :我正在使用C 11,而无需提升。

谢谢。

可能与这些行:

class FancyStore {
public:
  template <typename T>
  T& addItem(const T& item) {
     void*& raw = store_[typeid(T)];
     if (!raw) {
       raw = new std::vector<T>();
     }
     auto v = static_cast<std::vector<T>*>(raw);
     v->push_back(item);
     return v->back();
  }    
  template <typename T>
  T& getItem(size_t index) {
     void* raw = store_[typeid(T)];
     auto v = static_cast<std::vector<T>*>(raw);
     return (*v)[index];
  }
private:
  std::unordered_map<std::type_index, void*> store_;
};

现场演示。复制,破坏者,错误处理作为读者的练习。