
Boost Users : 
From: David Abrahams (dave_at_[hidden])
Date: 20050804 19:55:57
Eduardo Bezerra <edubez_at_[hidden]> writes:
> I'm reading the C++ Template Metaprogramming book and I'm not
> understanding the following code from page 6566:
>
> template <class T>
> struct param_type
> : mpl::eval_if <
> typename boost::is_scalar<T>::type
> , mpl::indentity<T>
> , boost::add_reference<T const>
> >
> {};
>
> template <class T>
> struct param_type
> : mpl::eval_if <
> boost::is_scalar<T>
> > ^^^^^^^^^^^^^^^^^^^^^^^ <
> , mpl::indentity<T>
> , boost::add_reference<T const>
> >
> {};
>
> After reading again and again the explanation I still don't get why we
> don't need to use typename ....::type anymore. The text explains that
> all Boost's integral metafunctions suply a nested ::value, but how it is
> used in this context ?
Well,
typename boost::is_scalar<T>::type
is some
mpl::bool_<X>
which happens to be a class that fulfils the requirements that eval_if
places on its first argument.
http://www.boost.org/libs/mpl/doc/refmanual/evalif.html
shows that the requirement is that the argument be a model of Integral
Constant. If you click through to the requirements page
http://www.boost.org/libs/mpl/doc/refmanual/integralconstant.html
for Integral Constant you can see what those are; (**) they include the
requirement that the class have a nested ::value. However, we can drop
typename...::type because
boost::is_scalar<T>
also happens to be a model of Integral constant with the same
properties as its nested ::type. That might be achieved this way:
template <class T>
struct is_scalar_impl
{
typedef mpl::bool_< ... > type;
};
template <class T>
struct is_scalar
: is_scalar_impl<T>::type // derive from mpl::bool_< ... >
{
typedef typename is_scalar_impl<T>::type type;
};
It turns out that any class derived from mpl::bool_<X> is also a model
of Integral Constant with the same properties as mpl::bool_<X> has.
I hope this explains it.
(**) Aleksey, I think Integral Constant is much too strong a
requirement for the first argument to eval_if. Most of those things
requiring a bool_ or similar really just need a nested ::value.
 Dave Abrahams Boost Consulting www.boostconsulting.com
Boostusers 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