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 ответа

Решение

objects[0] это указатель на объект. Ваш актерский состав (кстати, никогда не использует C-стиль) пытается конвертировать shared_ptr<Wrapper> возражать против Father<int> объект. Конечно, это невозможно, поскольку эти два типа совершенно не связаны.

Разыменуйте указатель и уменьшите его до ссылки (если вы хотите полиморфизм):

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

Вам не нужно оборачивать свой шаблонный класс, чтобы иметь возможность создавать вектор с его типом.

Это будет работать просто отлично

std::vector<std::shared_ptr<Father<int>>> objects;
std::shared_ptr<Father<int>> object = objects.at(0);
Другие вопросы по тегам