Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Numeric Converter Policy Classes

Boost , Chapter 1. Boost.NumericConversion , Chapter 1. Boost.NumericConversion

Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext
namespace boost { namespace numeric {
    enum range_check_result
    {
        cInRange     ,
        cNegOverflow ,
        cPosOverflow
    } ;
} }

Определяет значения, возвращаемыеповышением:Численность:Конвертер<>::out_of_range()

Этотбезгосударственныйнешаблонный класс политики должен бытьфункциональным объектоми призван управлять результатом проверки диапазона. Он может сделать исключение, если переполнение было обнаружено путем проверки диапазона, как указано в его аргументе. Если же он бросит, то рекомендуетсястд:плохойили производный.

Он должен иметь следующий интерфейс (он не должен быть классом шаблонов):

struct YourOverflowHandlerPolicy
{
    void operator() ( boost::range_check_result ) ; // throw bad_cast or derived
} ;

Он называется результатом преобразованияout_of_range()внутриvalidate_range().

Это два класса обработчиков переполнения, предоставляемых библиотекой:

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";
        }
    };
} }
[Important] Important

ПРИМЕЧАНИЕ ВНИМАНИЯ для 1.33Ранее для повышения версии 1.33 был назван класс исключенийbad_numeric_castbad_numeric_conversion. Однако в 1.33 старая функцияnumeric_castотboostcastбыла полностью заменена новойnumeric_castвboost/numericnumericcastcastcastboostcast. Эта старая функция, которая существовала в ускорении в течение довольно долгого времени, использовала Bad_numeric_castв качестве своего типа исключения, поэтому я решил избежать проблем с обратной совместимостью, приняв его.

Этот класс политики шаблонабез состоянияопределяет режим округления, используемый дляплавающих до интегральныхпреобразований. Поставляетближний()статическая функция элемента, выставленная преобразователем, что означает, что онпублично наследует от этой политики.

Политика должна иметь следующий интерфейс:

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 ;
} ;

Это более круглые классы, предоставляемые библиотекой (только конкретные части показаны, см. общую форму политики выше).

[Note] Note

Эти классы предназначены не для функций округления общего назначения, а для конкретных политикпреобразователя<>. Поэтому они не являются функциональными объектами.

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> ; }
} ;

Эта политика в основном предоставляется в качестве крючка для определенных пользователем типов, которые не поддерживаютstatic_cast<>конверсии в некоторые типы.

Это единственный класс политики конвертера, предоставляемый библиотекой:

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). Библиотека предоставляет класс:UseInternalRangeChecker{}; который представляет собойфейковуюполитику RangeChecker, используемую для сигнализации преобразователя для использования его внутренней реализации проверки диапазона.


PrevUpHomeNext

Статья Numeric Converter Policy Classes раздела Chapter 1. Boost.NumericConversion Chapter 1. Boost.NumericConversion может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Boost.NumericConversion ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:14:29/0.010375022888184/1