
On 12/13/10 10:02, Philipp Hamann wrote:
Hi all, I have a class, call it "Property", containing a value, which can be of many different types, like int, string, bool, but also a pointer to binary data. So I decided to use boost::variant.
The problem is that when I assign a pointer to the variant, it is implicitly casted to a bool. So I do not get the pointer out of the variant again.
Is boost::variant not suitable for my needs or is there a recommended workaround?
I will post some code to make my problem more clear.
boost::variant<void*, bool, int, std::string> value; void* p; value = p; bool b = boost::get<bool>(value); //OK void* p2 = boost::get<void*>(value); //Error
Thanks for your help
Philipp
I think you'll have to explicitly cast the argument as shown in post: http://article.gmane.org/gmane.comp.lib.boost.user/59167 One other option is to wrap the actual type with a tag and then used those wrapped and tagged types as args to variant. IOW, instead of: variant<T1,T2,...,Tn> where for some i and j, Ti can be constructed from a Tj, you would have: variant<wrap<1,T1>,wrap<2,T2>,...,wrap<n,Tn> > where: template<int Tag, typename T> struct wrap { T my_t; wrap(T const& a_t):my_t(a_t){} }; At least that's the only way I can figure out to workaround this variant limitation. OTOH, there's an alternative, non-boost variant which doesn't suffer from this problem but does require one to be more explicit by requiring the use of an inject<Tag_i>(Ti) member function. The template is here: http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_st... and the test driver is here: http://svn.boost.org/svn/boost/sandbox/variadic_templates/libs/composite_sto... Unfortunately, this alternative to variant might take more compile time, but I've not tested that. HTH. -Larry