mirror of
				https://github.com/boostorg/integer.git
				synced 2025-11-04 02:01:38 +01:00 
			
		
		
		
	
		
			
	
	
		
			89 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			3.0 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="../../c++boost.gif" alt="c++boost.gif (8819 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>
							 | 
						||
| 
								 | 
							
								<a href="../../people/jens_maurer.htm">
							 | 
						||
| 
								 | 
							
								Jens Maurer</a>, 2000-02-20
							 |