November 2005
Beginner to intermediate
594 pages
16h 23m
English
You have number of one type
and you need to convert it to another, such as an int to a short or a vice versa, but you
want to catch any overflow or underflow errors at runtime.
Use Boost’s numeric_cast class template. It
performs runtime checks that throw an exception of type bad_numeric_cast if you will overflow or underflow the variable where you are
putting a value. Example 3-8 shows you how
to do this.
Example 3-8. Safe numeric conversions
#include <iostream>
#include <boost/cast.hpp>
using namespace std;
using boost::numeric_cast;
using boost::bad_numeric_cast;
int main() {
// Integer sizes
try {
int i = 32767;
short s = numeric_cast<short>(i);
cout << "s = " << s << endl;
i++; // Now i is out of range (if sizeof(short) is 2)
s = numeric_cast<short>(i);
}
catch (bad_numeric_cast& e) {
cerr << e.what() << endl;
}
try {
int i = 300;
unsigned int ui = numeric_cast<unsigned int>(i);
cout << ui << endl; // Fine
i *= -1;
ui = numeric_cast<unsigned int>(i); // i is negative!
}
catch (bad_numeric_cast& e) {
cerr << e.what() << endl;
}
try {
double d = 3.14;
int i = numeric_cast<int>(d);
i = numeric_cast<int>(d); // This shaves off the 0.14!
cout << i << endl; // i = 3
}
catch (bad_numeric_cast& e) {
cerr << e.what() << endl;
}
}You are probably aware of the fact that the basic C++ types have different sizes. The
C++ standard has strict specifications for the relative size of types—an int is always at least as big as a