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

Comparisons

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Comparisons

Как было сказано ранее, определение операторов сравнения вызывает небольшую проблему. Существует множество способов их определения, в зависимости от типа возврата или ожидаемого порядка. Именно поэтому смысл операторов не фиксируется раз и навсегда.

На то, как определяются операторы, могла повлиять политика, как это уже имеет место для округления и проверки. Однако сравнения являются скорее внешним свойством класса, чем внутренним. Они предназначены для локальной модификации, независимо от типа интервалов.

Операторы<<>,<<=>,<>>,<>=>,<==>,<!=>определяются каждый раз; и, подобно арифметическим операторам, они могут принимать аргумент базового типа. Однако из-за технических ограничений этот базовый тип может быть только вторым аргументом; поэтому операторы, к сожалению, не полностью симметричны. Тип возврата не всегда<bool>, так как некоторые интересные результаты могут быть достигнуты с помощью типа возврата трех состояний. Вот общие подписи операторов:

template<class T, class Policies1, class Policies2>
return_type operator== (const interval<T, Policies1>&, const interval<T, Policies2>&);
template<class T, class Policies>
return_type operator== (const interval<T, Policies>&, const T&);

vided comparisons

Default comparison

Если ничего не указано, значение операторов сравнения является расширением оператора по базовому типу. Точнее, если один из аргументов недействителен или пуст, бросается исключение. Если аргументы действительны, применяются следующие правила для определения результата [a,b]<op>c,d] [просто рассмотритеc<==>d, если второй аргумент имеет тип<T>:

  • х∈ [a,b] ∀y∈ [c,d](xopy), затемtrue
  • xa,byc,d!(xopy), затемfalse
  • В противном случае - исключение.

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

Other comparisons

Другие сравнения выбираются с помощью пространства имен. Эти пространства имен расположены под<boost::numeric::interval_lib::compare>и вызываются:

using namespace boost::numeric::interval_lib::compare::the_comparison_to_select;

После этой строки значение оператора по умолчанию будет заменено значением, расположенным в пространстве имен. Обратите внимание, что из-за правил поиска на C++ невозможно использовать два пространства имен один за другим, и они должны использоваться в разных иерархиях блоков. В противном случае компилятор будет жаловаться на неоднозначных операторов. Подводя итог:

// example 1: BAD
using namespace compare1;
...
using namespace compare2;
...
// example 2: GOOD
{ using namespace compare1;
  ...                       }
{ using namespace compare2;
  ...                       }
// example 3: BAD
using namespace compare1;
...
{ using namespace compare2;
  ...                       }

Теперь приходит список представленных сравнений. Все они находятся в соответствующих файлах заголовка<<boost/numeric/interval/compare/...>>. А что касается сравнения по умолчанию, операторы, как правило, жалуются, бросая исключение, если кормить недействительными значениями.

  • certain: это сравнение эквивалентно схеме по умолчанию с исключительным случаем, нанесенным наfalse. Так что эти операторы отвечаютtrueтолько тогда, когда сравнение проверено для всех пар элементов.
  • possible: на этот раз исключительный случай сопоставляется сtrue. Операторы отвечаютtrue, как только сравнение проверяется для пары элементов.
  • lexicographic: лексикографический порядок (сначала сравниваются нижние границы, а если недостаточно знать результат, то сравниваются верхние границы). Этот порядок не имеет значения в интервальной арифметике. Однако, поскольку это естественный общий порядок на паре (полностью упорядоченных) чисел, это может быть удобно в некоторых случаях.
  • set: установленный порядок включения частичный. На этот раз пустой интервал не считается недействительным (но недействительное число по-прежнему недействительно).<=и<являются подмножеством и надлежащими отношениями подмножества; и>=и>являются надмножеством и надлежащими отношениями надмножества.
  • triboolЭто сравнение основано на булевой библиотеке Boost tristate и изменяет операторы по умолчанию так, что явное неопределенное значение возвращается в третьем случае вместо того, чтобы бросать исключение.

Exception

namespace boost {
namespace numeric {
namespace interval_lib {
class comparison_error: std::runtime_error; // "boost::interval: uncertain comparison"
} // namespace interval_lib
} // namespace numeric
} // namespace boost

Explicit comparison functions

В некоторых ситуациях вы можете выполнить прямое сравнение на границах и избежать неопределенного случая, который появляется у операторов по умолчанию. Для этой цели предусмотрены некоторые функции. Они ожидают, что их аргументы будут действительны и вернут результат только после одного сравнения. Их имена составлены<cer>(для «определенного», если сравнение по умолчанию истинно, результат верен) или<pos>(для «возможного», если сравнение по умолчанию ложно, результат ложен), за которыми следуют<lt>,<le>,<gt>,<ge>,<eq>или<ne>. Они расположены в<<boost/numeric/interval/compare/explicit.hpp>>. Каждая из этих функций принимает два параметра и возвращает булеву; ожидается, что параметры будут действительными, неопределенное поведение может привести к иному. Например, определение сравнения «безусловно меньше»:

namespace boost {
namespace numeric {
namespace interval_lib {
template<class T, class Policies1, class Policies2>
bool cerlt(const interval<T, Policies1>& x, const interval<T, Policies2>& y);
template<class T, class Policies>
bool cerlt(const interval<T, Policies>& x, const T& y);
template<class T, class Policies>
bool cerlt(const T& x, const interval<T, Policies>& y);
} // namespace interval_lib
} // namespace numeric
} // namespace boost

Valid HTML 4.01 Transitional

Пересмотренный2006-12-242006-12-24[ORIG_END] -->

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé Brönnimann, Polytechnic University
Copyright © 2003 Guillaume Melquiond

Распространяется по лицензии Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию на) http://www.boost.org/LICENSE_1_0.txt)

Статья Comparisons раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:06:15/0.0065841674804688/1