Boost logo

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:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp

and the test driver is here:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/libs/composite_storage/sandbox/pack/composite_storage.leaf.test.cpp

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