特定のデータ ソースに関するメタデータを格納するクラスを作成中です。メタデータは、XML の構造と非常によく似たツリー構造になっています。メタデータ値は、整数、10 進数、または文字列値にすることができます。
このような状況で 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 if の問題を排除しません。
標準ライブラリを使用して C++ バリアント データ型に使用するのにクリーンなものを実装または見た人はいますか?