根据类型从向量中检索对象

时间:2015-01-02 23:19:54

标签: c++ templates

我有一个模板函数来检索一个对象:

template <class T>
class SystemManager {
public:
  std::vector<std::shared_ptr<BaseSystem<T>>> container_;

  template <template <typename> class S> // S<T> inherits from BaseSystem<T>
  std::shared_ptr<S<T>> retrieve() {
    return object of type S<T> from container_;
  }
};

有没有办法根据它的类型检索对象?有没有办法用std::unordered_map来做到这一点?

2 个答案:

答案 0 :(得分:4)

一种解决方案是迭代vector并在每个元素上尝试dynamic_pointer_cast,返回第一个成功的元素。

另一种解决方案,如果您可以更改容器,则使用mapunordered_mapstd::type_index作为密钥,shared_ptr为值。

答案 1 :(得分:0)

一个基本的解决方案是

#define STRING 1
#define INT    2
...
vector<pair<x,y>> container;

if(container[i].first == STRING)
// do something

其中pair的第一个元素是int类型。在向向量中添加元素之前(假设),您已经知道将它作为一对存储的类型。

container.push_back(make_pair(TYPE, myrealdata);

另一个解决方案是

vector<MyClass> container

class MyClass
{
    int type = STRING;
}

其他类继承MyClass并检查type的值。