我有一个模板函数来检索一个对象:
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
来做到这一点?
答案 0 :(得分:4)
一种解决方案是迭代vector
并在每个元素上尝试dynamic_pointer_cast
,返回第一个成功的元素。
另一种解决方案,如果您可以更改容器,则使用map
或unordered_map
,std::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的值。