Как получить тип шаблона данного элемента во время выполнения на С++?

Я разрабатываю простой Arrayкласс с возможностью хранения объектов любого типа, например вектор, который может содержать несколько типов данных в одном объекте. (Это для учебных целей.)

У меня есть пустой базовый класс с именемContainer:

class Container {};

И шаблонный подкласс с именемObject:

template <class T>
class Object : public Container {
    T& object;
public:
    Object(T& obj = nullptr) : object(obj) {}
};

У меня есть класс Array, который содержит vectorуказателей на Containers, которые я использую для хранения Objects:

class Array {
    std::vector<Container *> vec;
public:
    template <class T>
    void add_element(const T&);
    auto get_element(int);
};

add_elementсохраняет элементы в Objects и помещает их в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.

6
задан Michael Dorst 6 July 2012 в 22:28
поделиться