Hi Scott,
I'm so sorry for the terrible late response.
From a cursory look through the library doc, it appears that it's
possible to create a UDT such that numeric_cast will work with it.
For example,
class int24 { ... }; // for 24-bit ints; must also specialize
// std::numeric_limits, create a range
// checking policy, etc.
int i;
...
int24 myInt = numeric_cast<int24>(i); // throws if i's value
won't // fit in an int24
short s = numeric_cast<short>(myInt); // throws if myInt's value
won't // fit in a short
numeric_cast<> is merly a wrapper around
boost::numeric::converter Converter
which instantiates the Converter class with the default policies.
The default policy is to use the "internal range checking" logic, which, if
the source or target types are UDT, means no range checking at all.
But you can, however, create and pass your own range checking policy.
Is just that you can't simply use numeric_cast<> then.
You need to do it like this:
using boost::numeric ;
typedef conversion_traits Int24toIntTraits ;
typedef converter
Int24toIntConverter ;
int24 myInt = Int24toIntConverter::convert(i);
And so on for each pair.
A little shorter syntax is:
int24 myInt = typename make_converter_from
::template to<int>::type
::convert(i) ;
You can find an example of a custom range checker in the file:
libs/numeric/conversion/test/udt_support_test.cpp
of the Boost distribution.
HTH
--
Fernando Cacciola
SciSoft
http://fcacciola.50webs.com/