Re: [Boost-users] variant over base and derived classes

-----Original Message----- From: Hicham Mouline [mailto:hicham@mouline.org] Sent: 09 December 2010 00:04 To: 'boost-users@lists.boost.org' Subject: variant over base and derived classes
hello,
How to determine the actual type of the object stored in a variant?
struct S { virtual ~S() {} };
struct Deriv1 : public S { virtual ~Deriv1() {} };
struct Deriv2 : public S { virtual ~Deriv2() {} };
struct Deriv3 : public Deriv2 { virtual ~Deriv3() {} };
typedef boost::variant<S,Deriv1, Deriv2, Deriv3> my_variant_t;
Deriv3 d3;
struct print_type: public boost::static_visitor<> { template <typename T> void operator()(const T&) const { std::cout<< typeid(T).name() <<std::endl; } };
const S& s = d3; my_variant_t v = s; boost::apply_visitor( print_type(), v );
This prints S.
Is it a truncated copy of d3 that is stored v? Yes. How do I construct v polymorphically so that the real object is stored?
regards, You have to downcast before creating the variant. boost::variant only uses the static type of the object. In Christ, Steven Watanabe
If I am given a const S* sptr, how do I construct an instance of the above variant then? const Deriv1* d1ptr; const Deriv2* d2ptr; const Deriv3* d3ptr; my_variant_t v = ((d1ptr = dynamic_cast<const Deriv1*>(sptr)) != 0 )? *d1ptr: ((d2ptr = dynamic_cast<const Deriv2*>(sptr)) != 0 )? *d2ptr: ((d3ptr = dynamic_cast<const Deriv3*>(sptr)) != 0 )? *d3ptr: *sptr; Is there a better way of writing this? rds,
participants (1)
-
Hicham Mouline