From 8408cc0bd5c78bb3f2c2f47a49a18dafcfabb7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20J=C3=A4rvi?= Date: Fri, 16 Nov 2001 23:27:08 +0000 Subject: [PATCH] thomas witt:s patch for icl501, adds a workaround for explicitly qualified arguments Also fixed length, so that it now works for empty tuples as well [SVN r11722] --- include/boost/tuple/detail/tuple_basic.hpp | 29 +++++++++++---- .../detail/tuple_basic_no_partial_spec.hpp | 37 ++++++++++++++----- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/include/boost/tuple/detail/tuple_basic.hpp b/include/boost/tuple/detail/tuple_basic.hpp index 5b555b3..5f73253 100644 --- a/include/boost/tuple/detail/tuple_basic.hpp +++ b/include/boost/tuple/detail/tuple_basic.hpp @@ -67,6 +67,17 @@ template struct length; namespace detail { +#ifdef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS + + template struct workaround_holder {}; + +# define BOOST_TUPLE_DUMMY_PARM , detail::workaround_holder* = 0 +# define BOOST_TUPLE_SINGLE_DUMMY_PARM detail::workaround_holder* = 0 +#else +# define BOOST_TUPLE_DUMMY_PARM +# define BOOST_TUPLE_SINGLE_DUMMY_PARM +#endif + // -- generate error template, referencing to non-existing members of this // template is used to produce compilation errors intentionally template @@ -196,7 +207,7 @@ template inline typename access_traits< typename element >::type >::non_const_type -get(cons& c) { +get(cons& c BOOST_TUPLE_DUMMY_PARM) { return detail::get_class::template get< typename access_traits< @@ -211,7 +222,7 @@ template inline typename access_traits< typename element >::type >::const_type -get(const cons& c) { +get(const cons& c BOOST_TUPLE_DUMMY_PARM) { return detail::get_class::template get< typename access_traits< @@ -219,9 +230,6 @@ get(const cons& c) { >::const_type>(c); } - - - // -- the cons template -------------------------------------------------- template @@ -346,7 +354,7 @@ struct cons { typename access_traits< typename element::type >::non_const_type - get() { + get(BOOST_TUPLE_SINGLE_DUMMY_PARM) { return boost::tuples::get(*this); } @@ -354,7 +362,7 @@ struct cons { typename access_traits< typename element::type >::const_type - get() const { + get(BOOST_TUPLE_SINGLE_DUMMY_PARM) const { return boost::tuples::get(*this); } @@ -367,6 +375,11 @@ struct length { BOOST_STATIC_CONSTANT(int, value = 1 + length::value); }; +template<> +struct length > { + BOOST_STATIC_CONSTANT(int, value = 0); +}; + template<> struct length { BOOST_STATIC_CONSTANT(int, value = 0); @@ -753,6 +766,8 @@ tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, } // end of namespace tuples } // end of namespace boost +#undef BOOST_TUPLE_DUMMY_PARM +#undef BOOST_TUPLE_SINGLE_DUMMY_PARM #endif // BOOST_TUPLE_BASIC_HPP diff --git a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp b/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp index f98ed61..3c66360 100644 --- a/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp +++ b/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp @@ -53,6 +53,21 @@ namespace tuples { // a helper function to provide a const null_type type temporary inline const null_type cnull_type() { return null_type(); } +// forward declaration of tuple + template< + typename T1 = null_type, + typename T2 = null_type, + typename T3 = null_type, + typename T4 = null_type, + typename T5 = null_type, + typename T6 = null_type, + typename T7 = null_type, + typename T8 = null_type, + typename T9 = null_type, + typename T10 = null_type + > + class tuple; + namespace detail { // Takes a pointer and routes all assignments to whatever it points to @@ -263,6 +278,10 @@ namespace tuples { { BOOST_STATIC_CONSTANT(int, value = 1 + length::value); }; + + template<> struct length > { + BOOST_STATIC_CONSTANT(int, value = 0); + }; template<> struct length @@ -318,15 +337,15 @@ namespace tuples { // tuple class template< typename T1, - typename T2 = null_type, - typename T3 = null_type, - typename T4 = null_type, - typename T5 = null_type, - typename T6 = null_type, - typename T7 = null_type, - typename T8 = null_type, - typename T9 = null_type, - typename T10 = null_type + typename T2, + typename T3, + typename T4, + typename T5, + typename T6, + typename T7, + typename T8, + typename T9, + typename T10 > class tuple : public detail::map_tuple_to_cons::cons1