使用模板类输入转换问题

时间:2017-08-23 04:05:00

标签: c++ templates casting

我已经关注了代码,并希望将MyClass<int>,MyClass<float> ...存储在vector<BaseClass> mItems中,然后恢复原始类。

我试图弄清楚C ++中是否存在从基类转换为模板化类的方法,但现在我仍然无法找到如何做到的方法。

MyClass<int> lRecover1 = dynamic_cast<MyClass<int>>(mItems.at(0));

这不会编译,我也不明白为什么。如果有帮助,这是我的代码:

#include <vector>

class BaseClass
{
public:

    virtual ~BaseClass() {}
};


template<typename T>
class MyClass : public BaseClass
{
public:
    MyClass()
    {

    }

    ~MyClass()
    {

    }

};

void main()
{
    std::vector<BaseClass> mItems;

    MyClass<int> lItem1, lItem2;
    MyClass<float> lItem3, lItem4, lItem5;
    MyClass<double> lItem6, lItem7;


    //PROBLEM: I would like to recover the original class
    MyClass<int> lRecover1 = dynamic_cast<MyClass<int>>(mItems.at(0));
}

1 个答案:

答案 0 :(得分:2)

BaseClass个实例的向量只包含值BaseClass的实际实例。 BaseClass*个实例的向量将包含指向BaseClass或其任何子节点的指针。

std::vector<BaseClass*> items;
...
MyClass<int>* recover = dynamic_cast<MyClass<int>*>(items.at(0));

当您处理子类的可能性时,您必须始终使用指针或引用来建立间接层。 (在这种情况下你必须使用指针,因为引用不能存储在std::vector

特别是,如果您尝试将MyClass<int>实例存储在std::vector<BaseClass>类型的容器中,C ++将尝试使用BaseClass的副本将实例复制到向量中构造函数。这将导致BaseClass复制它所知道的数据并且无法复制子类信息,从而有效地丢失了额外的数据,这个问题通常被称为object slicing