Variante C ++

Estou no processo de criar uma classe que armazena metadados sobre uma fonte de dados específica. Os metadados são estruturados em uma árvore, muito semelhante à forma como o XML é estruturado. Os valores de metadados podem ser valores inteiros, decimais ou string.

Estou curioso para saber se existe uma boa maneira em C ++ de armazenar dados variantes para uma situação como essa. Gostaria que a variante usasse bibliotecas padrão, por isso estou evitando os tipos COM, Ole e SQL VARIANT que estão disponíveis.

Minha solução atual é mais ou menos assim:

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;
};

A classe MetaValue possui várias funções Get para obter o valor da variante atualmente armazenada, mas acaba tornando todas as consultas de um valor um grande bloco de instruções if / else if para descobrir qual valor estou procurando.

Também explorei o armazenamento do valor como apenas uma string e a execução de conversões para obter diferentes tipos de variantes, mas até onde eu vi isso leva a um monte de análise interna de strings e manipulação de erros, o que não é bonito, abre até uma grande e antiga lata de problemas de precisão e perda de dados com valores de ponto flutuante e ainda não elimina a consulta se / else se o problema for indicado acima.

Alguém implementou ou viu algo mais limpo para usar em um tipo de dados da variante C ++ usando bibliotecas padrão?

questionAnswers(5)

yourAnswerToTheQuestion