![]() |
Home | Libraries | People | FAQ | More |
There are some traits classes which authors of new backends should be aware of:
namespace boost{ namespace multiprecision{ namespace detail{ template<typename From, typename To> struct is_explicitly_convertible; }}}
Inherits from boost::integral_constant<bool,true> if type From
has an explicit conversion from To.
For compilers that support C++11 SFINAE-expressions this trait should "just
work". Otherwise it inherits from boost::is_convertible<From, To>::type, and will need to be specialised for
Backends that have constructors marked as explicit.
template <class From, class To> struct is_lossy_conversion { static const bool value = see below; };
Member value is true if the
conversion from From to
To would result in a loss
of precision, and false otherwise.
The default version of this trait simply checks whether the kind
of conversion (for example from a floating point to an integer type) is inherently
lossy. Note that if either of the types From
or To are of an unknown number
category (because number_category
is not specialised for that type) then this trait will be true.
template<typename From, typename To> struct is_restricted_conversion { static const bool value = see below; };
Member value is true if From
is only explicitly convertible to To
and not implicitly convertible, or if is_lossy_conversion<From, To>::value is true.
Otherwise false.
Note that while this trait is the ultimate arbiter of which constructors
are marked as explicit in class
number, authors of backend
types should generally specialise one of the traits above, rather than this
one directly.
template <class T> is_signed_number; template <class T> is_unsigned_number;
These two traits inherit from either mpl::true_
or mpl::false_, by default types are assumed to
be signed unless is_unsigned_number
is specialized for that type.