Douglas Paul Gregor <[EMAIL PROTECTED]> writes: > On Thu, 23 Jan 2003, David Abrahams wrote: > >> Douglas Paul Gregor <[EMAIL PROTECTED]> writes: >> >> > Why don't we have >> > >> > mpl::list<int, float, double, std::string> list_of_types; >> > for_each(list_of_types.begin(), list_of_types.end(), f); >> > >> > ? >> > >> > Then an unqualified for_each call can handle type sequences, heterogeneous >> > containers (e.g., tuple), and run-time sequences (e.g., vector). It's been >> > done before, elsewhere, so why don't we do it in MPL? >> >> It's clever, but I'm not sure what problem it's solving. > > I mentioned this before and cited the paper "Static Data > Structures: Reconciling Template Metaprogramming and Generic Programming": > http://aspn.activestate.com/ASPN/Mail/Message/1304415 > > The title says it all: we have generic programming and template > metaprogramming, and they complement each other nicely, but at the barrier > between them I feel that we have a kludge. MPL and STL are built on the > same abstractions, with similar naming schemes and similar style, so why > is it that at the bridge between the two we have something that looks like > neither? I think the for_each syntax I'm referring to is a clean bridge > between the two, because it (logically, if not in code) maps the syntax of > STL iterators to the syntax of MPL iterators in standard algorithm calls. > The paper I referred to gave the most compelling argument for having > precisely the same syntax at the bridge: you can test with the run-time > version (short compile times) and release with the compile-time version > (short execution times): they needed only to switch the object from > std::vector to a compile-time vector, wait for KAI C++ to grind away for > 24 hours, and they got 171 times the performance.
OK, point taken. I think it's worth examining. >> AFAICT it >> doesn't solve the problem that Andrei was pointing at. > > You mean the front/pop_front issue? No, I mean the complexity-of-expression issue. >> It also has at >> least one problem: it is intrusive on sequence types, requiring them >> to have begin()/end() member functions. If this was the only way to >> do it, it would break interoperability with 3rd-party type sequences. >> >> -Dave > > That's easy to fix---I was just trying to keep the example small. A few > extra abstractions would be needed: > > namespace mpl { > // Special type that for_each can pick up on > template<typename Iterator> > struct iterator > { > typedef Iterator type; > }; > > // Stores an MPL sequence defined by an iterator range > template<typename Begin, typename End> > struct sequence > { > iterator<Begin> begin() const { return iterator<Begin>(); } > iterator<End> end() const { return iterator<End>(); } > }; > > template<typename Begin, typename End, typename F> > F for_each(iterator<Begin> first, iterator<End> last, F f) > { > // ... > } > } > > Just stick your third-party iterators into sequence<> and you're all set; > I'd expect that mpl::list, mpl::vector, etc. would just derive from > mpl::sequence to reduce the amount of typing in the common case. Maybe it would be better to define namespace-scope begin(), end(), et. al which can operate on STL and MPL sequences. -- David Abrahams [EMAIL PROTECTED] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost