Estoy diseñando una clase simple Array
con la capacidad de sostener cualquier tipo de objeto, como un vector que puede contener múltiples tipos de datos en un objeto. (Esto es para fines de aprendizaje.)¿Cómo obtengo el tipo de plantilla de un elemento determinado en tiempo de ejecución en C++?
tengo una clase vacía base llamada Container
:
class Container {};
Y una subclase a plantillas llamada Object
:
template <class T>
class Object : public Container {
T& object;
public:
Object(T& obj = nullptr) : object(obj) {}
};
tengo una clase Array
que tiene una vector
de punteros a Container
s que utilizo para contener Object
s:
class Array {
std::vector<Container *> vec;
public:
template <class T>
void add_element(const T&);
auto get_element(int);
};
add_element
elementos almacena en Object
s y las pone en vec
:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
get_element
elimina el elemento del que es Object
y pasa de nuevo a la persona que llama. Aquí es donde reside mi problema. Con el fin de borrar un elemento de la Object
, necesito saber qué tipo de Object
es:
auto Array::get_element(int i)
{
return (Object</* ??? */> *)vec[i])->object;
}
¿Hay alguna manera para mí para encontrar qué tipo de objeto Estoy almacenando?
Editar: Dado que las personas afirman que esto no es posible, ¿qué tal esto. ¿Hay alguna manera de almacenar realmente información de tipo dentro de una clase? (Sé que puedes hacer eso en ruby). Si pudiera hacer eso, podría almacenar el tipo de devolución de get_element
en cada Object
.
@ildjarn: Desde el PO está usando 'auto' en la pregunta, creo que es seguro asumir que. –
@ user315052 porque sería más difícil de usar de esa manera. @ildjarn Sí, lo hace, pero si 'decltype (vec [i])' obtendré 'Container *'. Necesito saber qué subclase es. – anthropomorphic
@Jesse: Ah, buen punto. :-P – ildjarn