c++ 模板参数类型变量的dynamic_cast

问题描述 投票:0回答:1

为什么动态转换不适用于由模板参数类型专门化的向量?

如何解决这个问题?我想从向量中确定其中的元素是否是特定类的后代?

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 );
}
c++ templates dynamic-cast
1个回答
0
投票

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";
    }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.