Variante de C ++

Estoy en el proceso de crear una clase que almacena metadatos sobre una fuente de datos en particular. Los metadatos se estructuran en un árbol, muy similar a la forma en que se estructura XML. Los valores de metadatos pueden ser valores enteros, decimales o de cadena.

Tengo curiosidad por saber si hay una buena manera en C ++ de almacenar datos de variantes para una situación como esta. Me gustaría que la variante utilice bibliotecas estándar, así que estoy evitando los tipos COM, Ole y SQL VARIANT que están disponibles.

Mi solución actual se ve algo como esto:

enum MetaValueType
{
    MetaChar,
    MetaString,
    MetaShort,
    MetaInt,
    MetaFloat,
    MetaDouble
};

union MetaUnion
{
    char cValue;
    short sValue;
    int iValue;
    float fValue;
    double dValue;
};

class MetaValue
{
...
private:
    MetaValueType ValueType;
    std::string StringValue;
    MetaUnion VariantValue;
};

La clase MetaValue tiene varias funciones de Obtener para obtener el valor de la variante almacenada actualmente, pero termina haciendo que cada consulta para un valor sea un bloque grande de sentencias if / else if para determinar qué valor estoy buscando.

También he explorado el almacenamiento del valor como solo una cadena y la realización de conversiones para obtener diferentes tipos de variantes, pero por lo que he visto esto conduce a un montón de análisis de cadenas internas y manejo de errores que no es bonito, se abre una gran lata antigua de problemas de precisión y pérdida de datos con valores de punto flotante, y aún así no elimina la consulta si / más si el problema mencionado anteriormente.

¿Alguien ha implementado o visto algo que sea más limpio de usar para un tipo de datos de variante de C ++ utilizando bibliotecas estándar?

Respuestas a la pregunta(5)

Su respuesta a la pregunta