我有一个指向多态对象的向量_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
测试关系,你会这样做吗?
答案 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
将起作用。
但是,最好不要丢弃详细的类型信息。
例如,通过将其放在类中来限制对矢量的访问。然后在将对象指针添加到常规指针向量的函数中,将其添加到自己的更多特定于类型的集合中。每个更具体的对象要求的一个集合。