在多态指针向量中搜索特定类型及其子项

时间:2014-01-16 11:27:54

标签: c++ templates types polymorphism

我有一个指向多态对象的向量_v_polymorph,我写了一个模板方法来收集指向特定类型对象的所有指针:

template <class T> vector<T*> collect_all() const {
  vector<T*> v;
  for (auto e : _v_polymorph) {
    if ( typeid(T) == typeid(*e) ) {
      v.push_back(static_cast<T*>(e));
    }
  }
  return v;
}

我想修改它,以便在返回的向量中收集T子类的实例。

我对此的想法包括用dynamic_cast测试关系,你会这样做吗?

2 个答案:

答案 0 :(得分:1)

C ++面向对象,正确的方法:

obj->DoTheRightThing(); // does the right thing!

错误的方式:

if (( a = dynamic_cast<A*>(obj) ))
  a->DoTheAThing();
else if (( b = dynamic_cast<B*>(obj) ))
  b->DoTheBThing();
else ... // what if another sibling is added to A and B?

完全破碎的方式:

 if ( typeid(*obj) == typeid(A) )
  (dynamic_cast<A*>(obj))->DoTheAThing();
 else ... // what if another sibling OR descendant is added? 

所以你所想的是朝着正确方向迈出的一步 但是也要考虑下一步。

答案 1 :(得分:0)

如果类是多态的(至少一个虚拟成员函数),

dynamic_cast将起作用。

但是,最好不要丢弃详细的类型信息。

例如,通过将其放在类中来限制对矢量的访问。然后在将对象指针添加到常规指针向量的函数中,将其添加到自己的更多特定于类型的集合中。每个更具体的对象要求的一个集合。