Wariant C ++
Jestem w trakcie tworzenia klasy, która przechowuje metadane o określonym źródle danych. Metadane są uporządkowane w drzewie, bardzo podobne do struktury XML. Wartości metadanych mogą być wartościami całkowitymi, dziesiętnymi lub łańcuchowymi.
Jestem ciekawy, czy w C ++ jest dobry sposób na przechowywanie wariantów danych w takiej sytuacji. Chciałbym, aby wariant korzystał ze standardowych bibliotek, więc unikam dostępnych typów COM, Ole i SQL VARIANT.
Moje obecne rozwiązanie wygląda mniej więcej tak:
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;
};
Klasa MetaValue ma różne funkcje Get do uzyskania aktualnie przechowywanej wartości wariantu, ale kończy się tym, że każde zapytanie o wartość staje się dużym blokiem instrukcji if / else if, aby dowiedzieć się, jakiej wartości szukam.
Zbadałem również przechowywanie wartości jako tylko ciąg znaków i przeprowadzanie konwersji, aby uzyskać różne typy wariantów, ale o ile widziałem, prowadzi to do parsowania wewnętrznych ciągów znaków i obsługi błędów, które nie są ładne, otwiera się Podnieś starą puszkę problemów z precyzją i utratą danych z wartościami zmiennoprzecinkowymi, a mimo to nie wyeliminuje zapytania, jeśli problem został opisany powyżej.
Czy ktoś zaimplementował lub widział coś, co jest czystsze w użyciu dla typu danych wariantu C ++ przy użyciu standardowych bibliotek?