|
Boost : |
From: Dave Vasilevsky (gridd_at_[hidden])
Date: 2001-08-07 00:01:52
Hi,
I've been trying to use boost::any in one of my projects, but I keep running up
against a problem: Templates and boost::any don't work together the way I'd
like them to.
Here's what I mean. Code like the following is a trivial example of what
templates are all about.
=====
std::list<int> myList;
std::vector<int> myVec;
std::back_inserter(myList) = 1;
std::back_inserter(myVec) = 1;
=====
Although it's a pretty useless example, this shows templates operating on two
classes with the same interface. What I'd really love to be able to do is
something like this:
=====
boost::any stl_container;
if ( vector_is_optimal() )
stl_container = std::vector<int>();
else
stl_container = std::list<int>();
std::back_inserter( stl_container ) = 1;
=====
However, this won't work, since any doesn't have a push_back() method.
Equally good though, would be the ability to use the visitor idiom with any:
=====
class any {
...
template <typename UnaryFunctor>
UnaryFunctor::Result visit(UnaryFunctor& f) { contents->visit(f); }
...
class placeholder {
template <typename UnaryFunctor>
virtual UnaryFunctor::Result visit(UnaryFunctor& f) = 0;
/* etc */
=====
But this doesn't work either, since virtual methods can't be templated. So my
question: is there a way to implement the visitor idiom with any, or a
modified version thereof? Using just virtual methods, one could easily
implement a push_back() operation for any; but a new method must be added to
the definition of any every time one wants to add another operation. Is there a
general solution?
Thanks for your help,
Dave
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk