Boost logo

Boost Users :

From: goochrules! (goochrules_at_[hidden])
Date: 2004-08-12 16:01:39


I'm quite sure that this problem has been addressed many times before,
so I suspect it as a better name and I suspect that boost::any could
be the solution.

I want to store related types in the same stl container, for instance,
this is the class heirachy I want:

class tree { public: void grow() =0; };
class oak : public tree { public: void grow() { std::cout << "oak
grows slowly" << std::endl; };
class pine : public tree { public: void grow() { std::cout << "pine
grows quickly" << std::endl; };

Then, I try to put them in a std::list:

std::list< tree > forest;
forest.push_back(oak());
forest.push_back(pine());

...and I find out that I can't define tree::grow as abstract. So I
give it a dummy implentation -- void grow() { std::cout << "tree
grows" << std::endl; --, and try to iterate over the objects:

for(std::list< tree >::iterator iter = forest.begin(); forest.end() !=
iter; ++iter) {
iter->grow();
}

...and I don't get what I expect:
tree grows
tree grows

I then think about trying to use a std::list< tree& > and discover
that it won't compile. I think briefly consider std::list< tree* >
but decide this dosen't meet requirements of memory management.

So I do some searching for 'polymorphic container' and 'polymorphic
iterator' and come up with boost::any, but I've no luck in making it
work. Attached is my code.

In the end, I'm looking for a way to add related types to a stl
container and not have to do anything complicated to call a method on
the type's abstract interface and to not have to wory about memory
management. Maybe this question is better suited for
comp.lang.c++[.moderated]?

-- Matthew Peltzer
-- goochrules_at_[hidden]




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