title: How to store variant data in C++
body: <p>I'm in the process of creating a class that stores metadata about a particular data source.  The metadata is structured in a tree, very similar to how XML is structured.  The metadata values can be integer, decimal, or string values.</p>
  
  <p>I'm curious if there is a good way in C++ to store variant data for a situation like this.  I'd like for the variant to use standard libraries, so I'm avoiding the COM, Ole, and SQL VARIANT types that are available.</p>
  
  <p>My current solution looks something like this:</p>
  
  <pre><code>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;
  };
  </code></pre>
  
  <p>The MetaValue class has various Get functions for obtaining the currently stored variant value, but it ends up making every query for a value a big block of if/else if statements to figure out which value I'm looking for.</p>
  
  <p>I've also explored storing the value as only a string, and performing conversions to get different variant types out, but as far as I've seen this leads to a bunch of internal string parsing and error handling which isn't pretty, opens up a big old can of precision and data loss issues with floating point values, and still doesn't eliminate the query if/else if issue stated above.</p>
  
  <p>Has anybody implemented or seen something that's cleaner to use for a C++ variant data type using standard libraries?</p>