![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Numeric Converter Policy ClassesBoost , Chapter 1. Boost.NumericConversion , Chapter 1. Boost.NumericConversion
namespace boost { namespace numeric { enum range_check_result { cInRange , cNegOverflow , cPosOverflow } ; } } Определяет значения, возвращаемые Этотбезгосударственныйнешаблонный класс политики должен бытьфункциональным объектоми призван управлять результатом проверки диапазона. Он может сделать исключение, если переполнение было обнаружено путем проверки диапазона, как указано в его аргументе. Если же он бросит, то рекомендуется Он должен иметь следующий интерфейс (он не должен быть классом шаблонов): struct YourOverflowHandlerPolicy { void operator() ( boost::range_check_result ) ; // throw bad_cast or derived } ; Он называется результатом преобразования Это два класса обработчиков переполнения, предоставляемых библиотекой: namespace boost { namespace numeric { struct def_overflow_handler { void operator() ( range_check_result r ) // throw bad_numeric_conversion derived { if ( r == cNegOverflow ) throw negative_overflow() ; else if ( r == cPosOverflow ) throw positive_overflow() ; } } ; struct silent_overflow_handler { void operator() ( range_check_result ) // no-throw {} } ; } } И это исключительные классы, брошенные обработчиком переполнения по умолчанию(см. ВАЖНОЕ примечание). namespace boost { namespace numeric { class bad_numeric_cast : public std::bad_cast { public: virtual const char *what() const // throw() { return "bad numeric conversion: overflow"; } }; class negative_overflow : public bad_numeric_cast { public: virtual const char *what() const // throw() { return "bad numeric conversion: negative overflow"; } }; class positive_overflow : public bad_numeric_cast { public: virtual const char *what() const // throw() { return "bad numeric conversion: positive overflow"; } }; } }
Этот класс политики шаблонабез состоянияопределяет режим округления, используемый дляплавающих до интегральныхпреобразований. Поставляет Политика должна иметь следующий интерфейс: template<class S> struct YourFloat2IntRounderPolicy { typedef S source_type ; typedef {S or S const&} argument_type ; static source_type nearbyint ( argument_type s ) { ... } typedef mpl::integral_c<std::float_round_style,std::round_...> round_style ; } ; Это более круглые классы, предоставляемые библиотекой (только конкретные части показаны, см. общую форму политики выше).
namespace boost { namespace numeric { template<class S> struct Trunc { static source_type nearbyint ( argument_type s ) { using std::floor ; using std::ceil ; return s >= static_cast<S>(0) ? floor(s) : ceil(s) ; } typedef mpl::integral_c<std::float_round_style,std::round_toward_zero> round_style ; } ; template<class S> struct RoundEven { static source_type nearbyint ( argument_type s ) { return impl-defined-value ; } typedef mpl::integral_c<std::float_round_style,std::round_to_nearest> round_style ; } ; template<class S> struct Ceil { static source_type nearbyint ( argument_type s ) { using std::ceil ; return ceil(s) ; } typedef mpl::integral_c<std::float_round_style,std::round_toward_infinity> round_style ; } ; template<class S> struct Floor { static source_type nearbyint ( argument_type s ) { using std::floor ; return floor(s) ; } typedef mpl::integral_c<std::float_round_style,std::round_toward_neg_infinity> round_style ; } ; } } // namespace numeric, namespace boost Math Functions used by the rounder policiesБолее круглые политики, поставляемые этим заголовком, используют математические функции Однако при наличии других видимых соответствующих перегрузок может возникнуть двусмысленность. В этом случае пользователь может предоставить свою собственную политику округления, которая может, например, использовать полностью квалифицированный вызов. Этот метод позволяет использовать более круглые политики по умолчанию непосредственно с определенными пользователями типами. Пользователь требует, чтобы были видны подходящие перегрузки Этот класс политики шаблонабез состоянияиспользуется для выполнения фактического преобразования из Источника в Цель. Он обеспечивает Политика должна иметь следующий интерфейс: template<class Traits> struct YourRawConverterPolicy { typedef typename Traits::result_type result_type ; typedef typename Traits::argument_type argument_type ; static result_type low_level_convert ( argument_type s ) { return <impl defined> ; } } ; Эта политика в основном предоставляется в качестве крючка для определенных пользователем типов, которые не поддерживают Это единственный класс политики конвертера, предоставляемый библиотекой: namespace boost { namespace numeric { template<class Traits> struct raw_numeric_converter { typedef typename Traits::result_type result_type ; typedef typename Traits::argument_type argument_type ; static result_type low_level_convert ( argument_type s ) { return static_cast<result_type>(s) ; } } ; } } Этоткласс шаблонной политики без состоянияиспользуетсятолько в том случае, еслипереопределяетвнутреннюю логику проверки диапазона. Он обеспечивает Политика должна иметь следующий интерфейс: template<class Traits> struct YourRangeCheckerPolicy { typedef typename Traits::argument_type argument_type ; // Determines if the value 's' fits in the range of the Target type. static range_check_result out_of_range ( argument_type s ) ; // Checks whether the value 's' is out_of_range() // and passes the result of the check to the OverflowHandler policy. static void validate_range ( argument_type s ) { OverflowHandler()( out_of_range(s) ) ; } } ; Эта политикатолькопредусмотрена в качестве крючка для определенных пользователем типов, которые требуют проверки диапазона (которая по умолчанию отключена при включении UDT). Библиотека предоставляет класс: Статья Numeric Converter Policy Classes раздела Chapter 1. Boost.NumericConversion Chapter 1. Boost.NumericConversion может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Chapter 1. Boost.NumericConversion ::
|
||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |