
Tobias Schwinger wrote:
Ooops. I just noticed this problem has already been reported...
OK, The problem is that e.g. "begin< int_<1> >" doesn't return "void_" (as stated in the documentation) but fails to compile instead. Here is a tentative patch that straightens this issue. The code in the modified file seems to assume that "sequence_tag" sorts out non-sequences -- so it /might/ be more elegant to fix the problem there. Anyway, there is no such guarantee (according to the documentation) and it would require another detection whether "begin_impl" has been specialized, so it might as well be worse. Regards, Tobias Index: boost/mpl/aux_/begin_end_impl.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/mpl/aux_/begin_end_impl.hpp,v retrieving revision 1.8 diff -u -r1.8 begin_end_impl.hpp --- boost/mpl/aux_/begin_end_impl.hpp 2 Sep 2004 15:40:43 -0000 1.8 +++ boost/mpl/aux_/begin_end_impl.hpp 7 May 2006 14:12:19 -0000 @@ -17,7 +17,9 @@ #include <boost/mpl/begin_end_fwd.hpp> #include <boost/mpl/sequence_tag_fwd.hpp> #include <boost/mpl/void.hpp> +#include <boost/mpl/eval_if.hpp> #include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/aux_/has_begin.hpp> #include <boost/mpl/aux_/traits_lambda_spec.hpp> #include <boost/mpl/aux_/config/eti.hpp> @@ -27,12 +29,27 @@ // specializing either the 'begin_impl/end_impl' or the primary // 'begin/end' templates +namespace aux { + +template< typename Sequence > struct begin_type +{ + typedef typename Sequence::begin type; +}; + +template< typename Sequence > struct end_type +{ + typedef typename Sequence::end type; +}; + +} // namespace aux + template< typename Tag > struct begin_impl { template< typename Sequence > struct apply { - typedef typename Sequence::begin type; + typedef typename eval_if<aux::has_begin<Sequence,true_>, + aux::begin_type<Sequence>,void_ >::type type; }; }; @@ -41,7 +58,8 @@ { template< typename Sequence > struct apply { - typedef typename Sequence::end type; + typedef typename eval_if<aux::has_begin<Sequence,true_>, + aux::end_type<Sequence>,void_ >::type type; }; }; @@ -63,8 +81,7 @@ AUX778076_IMPL_SPEC(end, nested_begin_end_tag, typename Sequence::end) // if a type 'T' does not contain 'begin/end' or 'tag' members -// and doesn't specialize either 'begin/end' or 'begin_impl/end_impl' -// templates, then we end up here +// and doesn't specialize 'begin/end' templates, then we end up here AUX778076_IMPL_SPEC(begin, non_sequence_tag, void_) AUX778076_IMPL_SPEC(end, non_sequence_tag, void_) AUX778076_IMPL_SPEC(begin, na, void_)