Gmane
From: Tobias Schwinger <tschwinger <at> neoscientists.org>
Subject: Re: [mpl] patch: mpl::is_sequence< mpl::int_<1> >
Newsgroups: gmane.comp.lib.boost.devel
Date: 2006-05-07 14:22:03 GMT (3 years, 9 weeks, 6 days and 10 minutes ago)
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_)
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost