首页 > 解决方案 > C++ dynamic_cast 一个模板类到另一个模板

问题描述

我正在使用模板类A<widget_type>,我想知道是否可以dynamic_cast<A<another_type>*>(A<widget_type>*)。问题:在下面的代码中,A<B>* target2 = dynamic_cast<A<B>*>(&source);返回一个空指针。是否可以将模板类转换为同一个类但使用另一个模板?编辑:我必须制作一个数组保存A<B*>对象的程序,但A<B*>对象可能来自A<C*>or A<D*>。我需要在运行时检查是否A<B*>可以将其转换为所需的模板类。出于这个原因,我不能使用强类型,因为A<B*>对象可能来自一个A<E*>对象,E其他人可能创建的类在哪里,因此,可能没有转换函数到该模板类。代码:

template<typename widget_type>
class A
{
public:
    std::vector<widget_type*> value;

    virtual ~A() {}

    void Add(widget_type* val)
    {
        value.push_back(val);
    }
    template<typename return_type>
    operator A<return_type>()
    {
        unsigned int size = this->value.size();
        std::vector<return_type*> return_value;
        return_value.resize(size);
        for (unsigned int i = 0; i < size; i++)
        {
            return_value[i] = dynamic_cast<return_type*>(this->value[i]);
        }
        A<return_type> target;
        target.value = return_value;
        return target;
    }
};

class B
{
public:
    virtual ~B() {}
};

class C : public B
{
public:
    void Print()
    {
        std::cout << "C CALL\n";
    }
};

class D : public B
{

};

int main()
{
    std::cout << "Start!\n";
    A<C> source;
    C* val1 = new C;
    source.Add(val1);
    A<B> target = source;
    A<B>* target2 = dynamic_cast<A<B>*>(&source);
    if (target2)
    {
        std::cout << "POINTER\n"; 
    }
    std::cout << "END\n";
}```

标签: c++

解决方案


只有当你来自哪里和你要去哪里之间存在某种继承关系时,dynamic_cast 才会成功。

如果您只是想将一种类型的指针视为指向不同类型的指针(这通常适用于同一模板的不同专业化),那么 dynamic_cast 将不会成功。只有 c 样式或 reinterpret_cast 将允许强制转换,但即使这样,结果也没有定义。


推荐阅读