95 lines
3.3 KiB
HTML
95 lines
3.3 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||
|
||
<title>integer_traits: Compile-Time Limits for Integral Types</title>
|
||
</head>
|
||
|
||
<body bgcolor="#FFFFFF" text="#000000">
|
||
|
||
<h1><img src="../../boost.png" alt="boost.png (6897 bytes)" align="center" width="277" height="86">Compile-Time Integral
|
||
Type Limits</h1>
|
||
|
||
<p>
|
||
The C++ Standard Library <limits> header supplies a class template
|
||
numeric_limits<> with specializations for each fundamental
|
||
type.</p>
|
||
<p>
|
||
For integer types, the interesting members of std::numeric_limits<> are:
|
||
<pre> static const bool is_specialized; // will be true for integers
|
||
static T min() throw();
|
||
static T max() throw();
|
||
static const int digits; // for integers, # value bits
|
||
static const int digits10;
|
||
static const bool is_signed;
|
||
static const bool is_integer; // will be true for integers</pre>
|
||
For many uses, these are sufficient. But min() and max() are problematical because they are not constant expressions
|
||
(std::5.19), yet some usages require constant expressions.
|
||
<p>
|
||
The template class <code>integer_traits</code> addresses this
|
||
problem.
|
||
|
||
|
||
<h2>Header <code><a href="../../boost/integer_traits.hpp">integer_traits.hpp</a></code> Synopsis</h2>
|
||
|
||
<pre>namespace boost {
|
||
template<class T>
|
||
class integer_traits : public std::numeric_limits<T>
|
||
{
|
||
static const bool is_integral = false;
|
||
};
|
||
|
||
// specializations for all integral types
|
||
}</pre>
|
||
|
||
|
||
<h2>Description</h2>
|
||
|
||
Template class <code>integer_traits</code> is derived from
|
||
<code>std::numeric_limits</code>. In general, it adds the single
|
||
<code>bool</code> member <code>is_integral</code> with the
|
||
compile-time constant value <code>false</code>. However, for all
|
||
integral types <code>T</code> (std::3.9.1/7 [basic.fundamental]),
|
||
there are specializations provided with the following compile-time
|
||
constants defined:
|
||
<p>
|
||
<table border=1>
|
||
<tr><th>member</th><th>type</th><th>value</th></tr>
|
||
<tr><td><code>is_integral</code></td><td>bool</td><td><code>true</code></td></tr>
|
||
<tr><td><code>const_min</code></td><td><code>T</code></td><td>equivalent
|
||
to <code>std::numeric_limits<T>::min()</code></td></tr>
|
||
<tr><td><code>const_max</code></td><td><code>T</code></td><td>equivalent
|
||
to <code>std::numeric_limits<T>::max()</code></td></tr>
|
||
</table>
|
||
|
||
<p>
|
||
|
||
<em>Note:</em> A flag <code>is_integral</code> is provided, because a
|
||
user-defined integer class should specialize
|
||
<code>std::numeric_limits<>::is_integer = true</code>,
|
||
nonetheless compile-time constants <code>const_min</code> and
|
||
<code>const_max</code> cannot be provided for that user-defined class.
|
||
|
||
<h2>
|
||
|
||
Test Program</h2>
|
||
|
||
<p>
|
||
|
||
The program <code><a href="integer_traits_test.cpp">integer_traits_test.cpp</a></code>
|
||
exercises the <code>integer_traits</code> class.
|
||
|
||
<h2>Acknowledgements</h2>
|
||
|
||
Beman Dawes, Ed Brey, Steve Cleary, and Nathan Myers discussed the integer
|
||
traits idea on the boost mailing list in August 1999.
|
||
<hr>
|
||
<p>Revised
|
||
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->06 November 2007<!--webbot bot="Timestamp" endspan i-checksum="40336" --></p>
|
||
<p><EFBFBD> Copyright Beman Dawes 2000</p>
|
||
|
||
<p>Distributed under the Boost Software License, Version 1.0. See
|
||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
|
||
|