Trying to Get Boost Variant Working
Friday, July 30th, 2010Once more unto the boost... this time to try and get the boost::variant working. In my particular application, I've got a self-defined data stream that can include:
- Map - all keys are up to 256-character strings, values are variants
- List - all elements are variants
- Integer
- Double
- String
- Boolean
- NULL
- UUID
- Date
- Error - which is a boost::tuple of a UUID, an integer, and a variant
and with the recursion in the definition with the map and list, I wanted to try the boost make_recursive_variant capabilities.
I sure do wish boost had better docs, because even getting to the point that the code compiles was an all-day affair. Primarily due to two lines of code:
void variant::set( std::map<std::string, variant> & aMap ) { mValue = aMap; }
and:
void variant::set( std::list<variant> & aList ) { mValue = aList; }
In theory, and in practice, this should set the value of the ivar mValue, the boost::variant, to the map and list, respectively. But I got the most insane compiler errors I've ever seen. Oddly enough, when I do:
void variant::set( std::string & aValue ) { mValue = aValue; }
everything works just fine. So it's clearly something about the recursive definition in the code. Possibly in the const-ness of one of something, but I tried all possible permutations I could think of. Nothing worked.
Finally, I tried this:
void variant::set( std::map<std::string, variant> & aMap ) { mValue.get< std::map<std::string, variant> > = aMap; }
and it compiled, but when I called this code and the value in the variant was not already a map, this threw a "bad cast" boost exception. Very understandable... I'm saying give me the existing map, and then set this guy there, but there's no existing map.
Exceptionally frustrating, but I'll have to hit it again on Monday.