Re: Are there mixed type containers?
On 11 mar, 01:05, DeMarcus <nob...@tellus.orb.sunsite.dk> wrote:
Thanks! That was what I was looking for. I tried boost::any and it
stores values as I wanted, e.g. this works.
std::vector<boost::any> args;
args.push_back( "Hello" );
args.push_back( 4711 );
But I don't understand how to iterate over the elements. This does not work:
for( std::vector<boost::any>::iterator i = args.begin(); i !=
args.end(); ++i )
std::cout << (*i) << std::endl;
Of course it won't work.
As said to use something not unlike boost.any, not boost.any itself.
A quick implementation I'm writing just for this message (so no well
tested, may contain bugs):
#include <boost/utility.hpp>
#include <algorithm>
#include <ostream>
struct streamable_impl_base : boost::noncopyable
{
virtual streamable_impl_base* clone() = 0;
virtual std::ostream& stream(std::ostream& os) = 0;
virtual ~streamable_impl_base()
{
}
};
template<typename T>
struct streamable_impl : streamable_impl_base
{
streamable_impl(const T& t_) : t(t_)
{
}
streamable_impl_base* clone()
{
return new streamable_impl<T>(t);
}
std::ostream& stream(std::ostream& os)
{
return os << t;
}
private:
T t;
};
struct streamable
{
template<typename T>
streamable(const T& t) : p(new streamable_impl<T>(t))
{
}
streamable(const streamable& s) : p(s.p->clone())
{
}
streamable& operator=(streamable s)
{
swap(s);
return *this;
}
void swap(streamable& s)
{
std::swap(p, s.p);
}
~streamable()
{
delete p;
}
friend std::ostream& operator<<(std::ostream& os, const
streamable& s)
{
return s.p->stream(os);
}
private:
streamable_impl_base* p;
};
Now use streamable instead of any:
std::vector<streamable> args;
args.push_back( (const char*)"Hello" ); // arrays are not
CopyConstructible
args.push_back( 4711 );
for( std::vector<streamable>::iterator i = args.begin(); i !=
args.end(); ++i )
std::cout << (*i) << std::endl;
I even tested it and verified it worked as expected.
Note, however, that I still do not see why you would be needing this
to do a lazy cout.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]