|
Boost Users : |
Subject: Re: [Boost-users] Variant pointer and bool
From: Larry Evans (cppljevans_at_[hidden])
Date: 2010-12-13 13:23:56
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:
and the test driver is here:
Unfortunately, this alternative to variant might take more compile
time, but I've not tested that.
HTH.
-Larry
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net