|
Boost Users : |
From: Daniel Krügler (dsp_at_[hidden])
Date: 2005-08-05 07:24:29
(OK, this is my third try. I got problems with (re)subscriptions
**although** I am subscribed since years...)
Dear Boosters,
its quite a while that I could participate in this newsgroup, so maybe
my request is ol' stuff and has been answered 100 times. In case of that
I apologize for the following question:
I observe that boost::tuple::length in version 1.32 exist two template
specializations for empty tuples, namely
template<>
struct length<tuple<> > {
BOOST_STATIC_CONSTANT(int, value = 0);
};
template<>
struct length<null_type> {
BOOST_STATIC_CONSTANT(int, value = 0);
};
which lead to the unexpected effect that e.g.
typedef const tuple<> ConstEmptyTuple;
int k = length<ConstEmptyTuple>::value;
(modulo namespace issues) does not compile. The reason is obvious,
because deduction of boost::tuples::length<ConstEmptyTuple>
extracts "const tuple<>", which leads to the generic template
definition:
template<class T>
struct length {
BOOST_STATIC_CONSTANT(int, value = 1 + length<typename
T::tail_type>::value);
};
which does not compile in this case, because const oost::tuples::tuple<>
has no tail_type. Similar situations arise for const null_type arguments
and corresponding volatile variants thereof.
To my humble opinion tuples::length should work independent of cv
qualification of the template arguments, but this route should of course
be gone in accordance to similar situations of "template predicates" in
boost::mp/type_traits.
One further indirection and usage of boost::remove_cv<T> could
simply resolve the described problem, such as:
// Define length_impl + 2 specialisation for tuple<> and null_type as
// currently done for length
namespace details {
template <typename T>
struct length_impl
{
.. // as before;
};
template <>
struct length_impl<null_type>
{
.. // as before;
};
template <>
struct length_impl<tuple<null_type, ...> >
{
.. // as before;
};
}
// One single - not specialized - length template handling all cases:
template <typename T>
struct length
{
static const int value = details::length_impl<
typename ::boost::remove_cv<T>::type >::value;
};
What do you think?
Greetings from Bremen,
Daniel Krügler
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net