Я разрабатываю простой Array
класс с возможностью хранения объектов любого типа, например вектор, который может содержать несколько типов данных в одном объекте. (Это для учебных целей.)
У меня есть пустой базовый класс с именемContainer
:
class Container {};
И шаблонный подкласс с именемObject
:
template <class T>
class Object : public Container {
T& object;
public:
Object(T& obj = nullptr) : object(obj) {}
};
У меня есть класс Array
, который содержит vector
указателей на Container
s, которые я использую для хранения Object
s:
class Array {
std::vector<Container *> vec;
public:
template <class T>
void add_element(const T&);
auto get_element(int);
};
add_element
сохраняет элементы в Object
s и помещает их вvec
:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
get_element
удаляет элемент из Object
и возвращает его вызывающей стороне. Вот в чем моя проблема.Чтобы удалить элемент из Object
, мне нужно знать, какой это тип Object
:
auto Array::get_element(int i)
{
return (Object</* ??? */> *)vec[i])->object;
}
Есть ли способ узнать, какой объект я храню?
Изменить:так как люди утверждают, что это невозможно, как насчет этого. Есть ли способ действительно хранить информацию о типе внутри класса? (Я знаю, что вы можете сделать это в ruby ). Если бы я мог это сделать, я мог бы хранить возвращаемый тип get_element
в каждом Object
.