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?