向下转换到模板类

时间:2019-02-06 14:37:07

标签: c++ templates downcast

我有模板类,我想拥有此类类型的矢量。 我看到了一种解决方案,您需要将该类与另一个没有模板的类进行包装,然后再有一个新类的向量。 现在,我想向下转换例如列表对象之一-但不允许强制转换。 我该怎么办?

示例:

class Wrapper
{
}

template <typename T>
class Father : public Wrapper
{
}

int main()
{
    std::vector<std::shared_ptr<Wrapper>> objects;
    Father<int> object = (Father<int>)objects.at(0); // ERROR (lets say i know its integer)
}

2 个答案:

答案 0 :(得分:3)

objects[0]是对象的 指针 。您的类型转换(顺便说一句,不要使用C风格的类型转换)会尝试将shared_ptr<Wrapper>对象转换为Father<int>对象。当然,这是不可能的,因为这两种类型是完全不相关的。

取消引用指针并将其向下转换为引用(如果需要多态):

auto& object = static_cast<Father<int>&>(*objects[0]);

答案 1 :(得分:0)

您无需包装模板类即可创建具有其类型的向量。

这很好用

std::vector<std::shared_ptr<Father<int>>> objects;
std::shared_ptr<Father<int>> object = objects.at(0);