Boost logo

Boost :

From: Emily Winch (emily_at_[hidden])
Date: 2002-08-01 13:07:38


Douglas Gregor wrote:

[ Mike Burton's paper demonstrating a heterogenous value container ]

> Anyone want to figure out a typelist equivalent for this static data structure
> with dynamic elements? I can't find a good one, and I think that justifies
> the need for a type vector in MPL. I also think that typelists are
> well-justified, so conclude what you may.

Are you asking if it's possible to make a cons-list-like heterogenous
value container? In which case, yes it is. See Boost.Tuple, or
http://groups.yahoo.com/group/boost/files/associative_list/ (and also
http://oonumerics.org/tmpw01/winch.pdf) for one with algorithms and
iterators. Interestingly, Mike's usage of his container, as described in
the paper, was confined entirely to for_each style usage, for which a
cons-list-based container would presumably have no speed disadvantage.
My paper does present some applications for random access, but I have
never _used_ it to do those things (except in test code). Boost.Tuple
has random access, but would customarily be used for such small tuples
that the list/vector speed difference might not be worth bothering
about. So at the moment I'm not sure there's a compelling argument for a
vector-based heterogenous container implementation. (Although I think
there ought to be).

In any case, it's not the case that a requirement for a certain
implementation of a heterogenous value container implies a requirement
for a type container with the same implementation. You can't really use
a type container to create a value container with the same complexity
characteristics. If people need two kinds of value container, I don't
think two kinds of type container will help other than for inspiration
and cut-and-paste purposes.

(I hope I'm wrong, I could easily be).

I'm really very interested in how a set of semi-compile-time containers
and algorithms like Boost.Tuple and my associative_list would fit in
with the MPL. I can imagine a for_each that says (pseudo meta-code)

if(container::tag == type_container)
   do_type_container_for_each
else
   do_value_container_for_each

But what if you want to be able to write

tuple<int, double, char> foo(1, 2.3, 'c');

for_each(begin<foo>(), end<foo>(), do_something_with_foo_values());
for_each(begin<foo>(), end<foo>(), do_something_with_foo_types());

hmmm...

if(has_parameters<functor>::type)
   do_value_container_for_each
else
   do_type_container_for_each

ugh.

Emily


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk