Boost logo

Boost Users :

From: klaus triendl (klaus_at_[hidden])
Date: 2008-02-16 06:01:38


Hi,

I've recently started studying the book "c++ template meta programming"
(I like it a lot!) and one of my own exercises was to get an integral
type's max/min value.

To get the type's maximal value I've created a metafunction max_val;

Compiling the code below with vc++2008 warning level 2+ yields the
warning "truncation of constant value" or "integral constant overflow"
if I use an int instead of a char.

<code>
namespace mpl = boost::mpl;

template<typename T>
struct significant_bits: mpl::int_<std::numeric_limits<T>::digits>
{};

template<typename T>
struct max_val_impl:
     mpl::accumulate<
         mpl::range_c<int, 1, significant_bits<T>::value>,
         mpl::integral_c<T, 1>,
         mpl::next<mpl::plus<mpl::_1, mpl::_1> >
>
{};

template<typename T>
struct max_val: max_val_impl<T>::type
{
     BOOST_MPL_ASSERT((boost::is_integral<T>));
};

int main()
{
     const char maxval = max_val<char>::value;
     return 0;
}
</code>

The problematic metafunction instantiation boils down to
mpl::integral_c<char, 127>
where
mpl::integral_c<char, 127>::next
results in 128 which is then truncated.

Of course I can turn off the compiler warnings but since the warning
happens in integral_wrapper.hpp and the integral constant stuff is
included in many other files including the boost type traits it would be
  tedious to always remember to include integral_c.hpp explicitly before
any other headers with the warnings turned off.

I don't know whether there is a really satisfying option, just wanted to
discuss this point.

Klaus Triendl


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