Field
solo no es un tipo, sino una plantilla que puede generar una familia de tipos, como Field<int>
y Field<double>
. Todos estos campos no están relacionados de modo que uno se deriva de alguna manera del otro o tal. Entonces debes establecer alguna relación entre todos estos tipos generados. Una forma es utilizar una plantilla de no-clase base común:
class FieldBase { };
template <typename T>
class Field : public FieldBase {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,FieldBase*> column;
};
Y considerar el uso de puntero inteligente en lugar de ese puntero prima en el código. De todos modos, ahora el problema es que la información de tipo se pierde, ya sea que apunte a Field<double>
o a Field<int>
ya no se conoce y solo se puede detectar manteniendo algún tipo de indicador de tipo en la base establecida por la plantilla clase derivada - o preguntando RTTI usando
dynamic_cast<Field<int>*>(field) != 0
Pero eso es feo. Especialmente porque lo que quieres allí es un valor semántico. Es decir, desearía poder copiar su fila y copiaría todos los campos en ella. Y desea obtener un doble cuando se almacena un doble, sin usar RTTI primero para abrirse camino hacia el tipo derivado.
Una forma de hacerlo es usar una unión discriminada. Eso es básicamente una unión para algunos tipos arbitrarios y, además, un indicador de tipo, que almacena qué valor está almacenado actualmente en ese campo (por ejemplo, si es doble, int, ...). Por ejemplo:
template <typename T>
class Field {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,
boost::variant< Field<int>, Field<double> > >
column;
};
boost :: variant hace todo el trabajo por usted. Puede usar las visitas para hacer que se llame a un functor usando la sobrecarga correcta.Eche un vistazo a su manual
¿Cuál es la pregunta? –
no tiene que transformar su código en html. simplemente póngalo como está, con una sangría de 4 caracteres. –
a Dave: Mi pregunta es: ya que el campo está modelado, ¿cómo puedo "decirle" al archivo std :: que los valores son "cualquier tipo de campo"? a litb: Gracias por la sugerencia! :-) – jbatista