...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Safe Numerics |
A type is Numeric if it has the properties of a number.
More specifically, a type T is Numeric if there exists a
specialization of std::numeric_limits<T>
. See the
documentation for the standard library class numeric_limits
.
The standard library includes such specializations for all the built-in
numeric types. Note that this concept is distinct from the C++ standard
library type traits is_integral
and
is_arithmetic
. These latter fulfill the requirement of the
concept Numeric. But there are types T which fulfill this concept for
which is_arithmetic<T>::value == false
. For example see
safe_signed_integer<int>
.
std::numeric_limits<T> |
The numeric_limits class template provides a C++ program with information about various properties of the implementation's representation of the arithmetic types. See C++ standard 18.3.2.2. |
In addition to the expressions defined in Assignable the following expressions must be valid. Any operations which result in integers which cannot be represented as some Numeric type will throw an exception.
Table 1. General
Expression | Return Type | Return Value |
---|---|---|
std::numeric_limits<T>::is_bounded
|
bool |
true or false
|
std::numeric_limits<T>::is_integer |
bool |
true or false
|
std::numeric_limits<T>::is_signed |
bool |
true or false
|
std::numeric_limits<T>::is_specialized
|
bool |
true |
Table 2. Unary Operators
Expression | Return Type | Semantics |
---|---|---|
-t |
T |
Invert sign |
+t |
T |
unary plus - a no op |
t-- |
T |
post decrement |
t++ |
T |
post increment |
--t |
T |
pre decrement |
++t |
T |
pre increment |
Table 3. Binary Operators
Expression | Return Type | Semantics |
---|---|---|
t - u |
V |
subtract u from t |
t + u |
V |
add u to t |
t * u |
V |
multiply t by u |
t / u |
T |
divide t by u |
t % u |
T |
t modulus u |
t < u |
bool |
true if t less than u, false
otherwise |
t <= u |
bool |
true if t less than or equal to u,
false otherwise |
t > u |
bool |
true if t greater than u, false
otherwise |
t >= u |
bool |
true if t greater than or equal to u,
false otherwise |
t == u |
bool |
true if t equal to u, false
otherwise |
t != u |
bool |
true if t not equal to u, false
otherwise |
t = u |
|
assign value of u to t |
t += u |
|
add u to t and assign to t |
t -= u |
|
subtract u from t and assign to t |
t *= u |
|
multiply t by u and assign to t |
t /= u |
|
divide t by u and assign to t |