|
Boost Users : |
From: Caleb Epstein (caleb.epstein_at_[hidden])
Date: 2005-01-09 23:30:19
On Fri, 7 Jan 2005 14:07:14 -0600, Matthew Jankowski
<mattjankowski_at_[hidden]> wrote:
>
>
> Hi all, I'm new to Boost and have some questions about how to get data out
> of a vector<boost::variant<> > container. For this purpose I put together
> 'class Base' which holds a vector<boost::variant <Base*, DerivedBase*> >
> Pointers. I wrote a function template to insert pointers, but I have real
> difficulty extracting pointers.
I'm not sure what you're trying to do makes much sense to do with
Boost.Variant. It is more suited to storing objects than pointers.
Why not just a std::vector<boost::shared_ptr<Base> >>? I'm assuming
your DerivedBase object inherits from Base and you're trying to avoid
slicing by storing pointers in your container.
If you're insistent on using Variant, you can use get<T> to pull out a
value by its type:
#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>
using namespace std;
using namespace boost;
struct base {};
struct derived : public base {};
typedef variant<base*, derived*> holder;
struct is_base {
bool operator () (holder& h) const {
return get<base*> (&h) != 0;
}
};
struct is_derived {
bool operator () (holder& h) const {
return get<derived*> (&h) != 0;
}
};
int
main ()
{
vector<holder> geoffrey;
geoffrey.push_back (new base);
geoffrey.push_back (new base);
geoffrey.push_back (new base);
geoffrey.push_back (new derived);
geoffrey.push_back (new derived);
cout << "base: " << count_if (geoffrey.begin (), geoffrey.end (),
is_base ())
<< ", derived: " << count_if (geoffrey.begin (), geoffrey.end (),
is_derived ())
<< endl;
}
-- Caleb Epstein caleb dot epstein at gmail dot com
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