Я нахожусь в процессе создания класса, который хранит метаданные о конкретном источнике данных. Метаданные структурированы в виде дерева, очень похожего на структуру XML. Значения метаданных могут быть целыми, десятичными или строковыми значениями.
Мне любопытно, есть ли в C ++ хороший способ хранить данные вариантов для такой ситуации. Я бы хотел, чтобы вариант использовал стандартные библиотеки, поэтому я избегаю доступных типов 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, если проблема указана выше.
Кто-нибудь реализовал или видел что-нибудь более чистое для использования в варианте типа данных C ++ с использованием стандартных библиотек?