Есть некоторые классы черт, о которых должны знать авторы новых бэкэндов:
namespace boost{ namespace multiprecision{ namespace detail{
template<typename From, typename To>
struct is_explicitly_convertible;
}}}
Наследуется от<boost::integral_constant<bool,true>
>, если тип<From
>имеет явное преобразование от<To
>.
Для компиляторов, поддерживающих SFINAE-выражения C++11, эта черта должна «просто работать». В противном случае он наследуется от<boost::is_convertible<From,To>::type
>и должен быть специализирован для Бэкэндов, у которых конструкторы помечены как<explicit
>.
template <class From, class To>
struct is_lossy_conversion
{
static const bool value = see below;
};
<value
>Верно, если переход от<From
>к<To
>приведет к потере точности, и<false
>в противном случае.
Версия по умолчанию этого признака просто проверяет, является ливидпреобразования (например, из плавающей точки в целочисленный тип) по своей сути убыточным. Обратите внимание, что если один из типов<From
>или<To
>относится к неизвестной категории чисел (поскольку<number_category
>не специализируется на этом типе), то эта черта будет<true
>.
template<typename From, typename To>
struct is_restricted_conversion
{
static const bool value = see below;
};
<value
>является<true
>, если<From
>является только явно конвертируемым в<To
>и не имплицитно конвертируемым, или если<is_lossy_conversion<From,To>::value
>является<true
>. В противном случае<false
>.
Обратите внимание, что в то время как эта черта является конечным арбитром, конструкторы которого помечены как<explicit
>в классе<number
>, авторы бэкэнд-типов обычно должны специализировать одну из черт выше, а не эту непосредственно.
template <class T>
is_signed_number;
template <class T>
is_unsigned_number;
Эти две черты наследуются от<mpl::true_
>или<mpl::false_
>, по умолчанию типы предполагается подписать, если<is_unsigned_number
>не является специализированным для этого типа.