Как привести указатель на базовый класс к объекту шаблонного наследника?

Задача состоит в том, что нужно хранить список или массив указателей базового класса, которые указывают на объекты потомков, но сложность в том, что класс наследник является шаблонным. То есть я бы хотел делать каст к наследнику, шаблонный тип которого мне из указателя базового класса не известен.

 class Base {
    //...//
};

template<typename T>
class Derived: public Base{
    T member;
}

int main(){

std::vector<Base*> vec { new Derived<int>(10), new Derived<bool>(false)};

...

std::cout<< vec[0]->get_member(); //И тут я хотел бы получить значение 10


return 0;
}

изменять значение не нужно согласно заданию, но необходимо возвращать хранимые шаблонные значения объектов класса наследника через указатели базового. Варианты хранить значения в виде обычной строки я рассматриваю только на крайний случай. Есть идеи как и можно ли вообще такое реализовать в одной функции без кучи проверок через dynamic_cast? Всем заранее спасибо!


Ответы (1 шт):

Автор решения: Harry

Смотрите, в std::cout<< vec[0]->get_member(); во время компиляции совершенно неизвестно, какой именно тип будет выводиться. Так что непосредственно как вы хотите - не получится... А вот так с использованием виртуальной функции - можно:

class Base
{
public:
    virtual ostream& out(ostream& os) = 0;
};

template<typename T>
class Derived: public Base
{
public:
    Derived(T t):member(t){}
    ostream& out(ostream& os) { os << member; return os; }
    T member;
};

int main(){

    std::vector<Base*> vec {
        new Derived<int>(10),
        new Derived<bool>(false)
    };
    vec[0]->out(cout); cout << endl;
    vec[1]->out(cout); cout << endl;

    return 0;
}

Это вас устроит?

Но если вы хотите получить именно значение и работать с ним - то вы должны получить тип использованного наследника тем или иным способом...

→ Ссылка