Как привести указатель на базовый класс к объекту шаблонного наследника?
Задача состоит в том, что нужно хранить список или массив указателей базового класса, которые указывают на объекты потомков, но сложность в том, что класс наследник является шаблонным. То есть я бы хотел делать каст к наследнику, шаблонный тип которого мне из указателя базового класса не известен.
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 шт):
Смотрите, в 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;
}
Это вас устроит?
Но если вы хотите получить именно значение и работать с ним - то вы должны получить тип использованного наследника тем или иным способом...