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?

questionAnswers(5)

yourAnswerToTheQuestion