Я создаю класс, в котором хранятся метаданные об определенном источнике данных. Метаданные структурированы в дереве, очень похожи на структуру XML. Значения метаданных могут быть целыми, десятичными или строковыми значениями.
Мне любопытно, есть ли хороший способ в С++ хранить варианты данных для такой ситуации. Я бы хотел, чтобы вариант использовал стандартные библиотеки, поэтому я избегаю доступных типов COM, Ole и SQL VARIANT.
Мое текущее решение выглядит примерно так:
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;
};
Класс MetaValue имеет различные функции Get для получения значения хранимого в данный момент значения, но в итоге он делает каждый запрос для значения большим блоком if/else if, чтобы выяснить, какое значение я ищу.
Я также изучил сохранение значения как только строки и выполнение преобразований для получения разных типов вариантов, но, насколько я видел, это приводит к кучке внутреннего анализа строк и обработки ошибок, который не является довольно, открывает большую старую возможность прецизионных и проблем с потерями данных с плавающей запятой и по-прежнему не устраняет запрос if/else, если проблема была заявлена выше.
Кто-нибудь реализовал или увидел то, что чище использовать для типа данных типа С++, используя стандартные библиотеки?