
Joel de Guzman wrote:
Hi,
In the variant docs, in the make_variant_over section (Using a type sequence to specify bounded types), it is not clear what MPL sequence concept it is referring to.
I was hoping it is a Forward Sequence, but I realized that when I try to use make_variant_over with a Forward Sequence, it fails trying to use mpl::clear, which hints that make_variant_over requires an MPL Extensible Sequence. This is rather undesirable. Is there a reason why this is so? Can't we lessen the requirement? The situation makes it not possible to use mpl views or fusion views for example.
Well, one could slowly but surely create an extensible sequence with mpl::copy. I had a quick take at this one to make things work without wasting compile time, see attached patch (tested with GCC4). Regards, Tobias Index: variant.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/variant/variant.hpp,v retrieving revision 1.97 diff -u -r1.97 variant.hpp --- variant.hpp 5 Jun 2006 02:00:58 -0000 1.97 +++ variant.hpp 17 Feb 2007 18:38:01 -0000 @@ -68,11 +68,12 @@ #include "boost/mpl/deref.hpp" #include "boost/mpl/pair.hpp" #include "boost/mpl/protect.hpp" -#include "boost/mpl/push_front.hpp" #include "boost/mpl/same_as.hpp" #include "boost/mpl/size_t.hpp" #include "boost/mpl/sizeof.hpp" -#include "boost/mpl/transform.hpp" +#include "boost/mpl/transform_view.hpp" +#include "boost/mpl/joint_view.hpp" +#include "boost/mpl/single_view.hpp" #include "boost/mpl/assert.hpp" /////////////////////////////////////////////////////////////////////////////// @@ -114,10 +115,8 @@ { private: // helpers, for metafunction result (below) - typedef typename mpl::transform1<Sequence, F>::type transformed_; - typedef typename mpl::max_element<transformed_ - - >::type max_it; + typedef mpl::transform_view<Sequence, F> transformed_; + typedef typename mpl::max_element<transformed_>::type max_it; public: // metafunction result @@ -216,12 +215,10 @@ { private: // helpers, for metafunction result (below) - typedef typename mpl::eval_if< + typedef typename mpl::if_< NeverUsesBackupFlag - , mpl::identity< Types > - , mpl::push_front< - Types, backup_holder<void*> - > + , Types + , mpl::joint_view< mpl::single_view< backup_holder<void*> >, Types> >::type types; typedef typename max_value< @@ -943,30 +940,30 @@ ::boost::mpl::not_< mpl::empty<specified_types> >::value )); - typedef typename mpl::eval_if< + typedef typename mpl::if_< is_recursive_ - , mpl::transform< + , mpl::transform_view< specified_types , mpl::protect< detail::variant::quoted_enable_recursive<wknd_self_t> > > - , mpl::identity< specified_types > + , specified_types >::type recursive_enabled_types; public: // public typedefs - typedef typename mpl::transform< + typedef mpl::transform_view< recursive_enabled_types , unwrap_recursive<mpl::_1> - >::type types; + > types; private: // internal typedefs - typedef typename mpl::transform< + typedef mpl::transform_view< recursive_enabled_types , mpl::protect< detail::make_reference_content<> > - >::type internal_types; + > internal_types; typedef typename mpl::front< internal_types