为什么动态转换不适用于由模板参数类型专门化的向量?
如何解决这个问题?我想从向量中确定其中的元素是否是特定类的后代?
class A {};
class B : public A {};
template<class _T_> void func(std::vector<_T_> &vect )
{
A* pA = dynamic_cast<A*>( vect.data() );
if( pA != nullptr) { /* I'm happy!*/ }
else { /* I'm sad! */ }
}
void main()
{
std::vector<B> vectorOfB;
func<B>( vectorOfB );
}
vector
是空的,所以它一定会失败。与此比较:
B* bp = nullptr;
A* ap = dynamic_cast<A*>(bp);
std::cout << ap << '\n'; // <- 0
添加元素:
std::vector<B> vectorOfB(1);
然后检查元素:
template <class T>
void func(std::vector<T>& vect) {
if(vect.empty()) return; // Can't check non-existing elements
A* pA = dynamic_cast<A*>(&vect.front()); // or vect.data()
if (pA) { /* I'm happy!*/
std::cout << "happy\n";
} else { /* I'm sad! */
std::cout << "sad\n";
}
}