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

Tutorial

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 21. Boost.Tribool

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

PrevUpHomeNext

Tutorial

Basic usage

Класс<tribool>действует как встроенный тип<bool>, но для 3-состоятельной булевой логики. Три состояния<true>,<false>и<indeterminate>, где первые два состояния эквивалентны состояниям C++.<bool>тип и последнее состояние представляют собой неизвестное булево значение (которое может быть<true>или<false>, мы не знаем).

Класс<tribool>поддерживает преобразование из<bool>значений и букв, а также собственное ключевое слово<indeterminate>:

tribool b(true);
b = false;
b = indeterminate;
tribool b2(b);

<tribool>поддерживает преобразования в<bool>для использования в условных утверждениях. Обращение в<bool>будет<true>, когда значение<tribool>всегда истинно, и<false>иначе. Следовательно, для определения того, какое из трех состояний в настоящее время принадлежит<tribool>, может использоваться следующая идиома:

tribool b = some_operation();
if (b) {
  // b is true
}
else if (!b) {
  // b is false
}
else {
  // b is indeterminate
}

<tribool>поддерживает 3-состоятельные логические операторы<!>(отрицание),<&&>(И) и<||>(ИЛИ) со значениями<bool>и<tribool>. Например:

tribool x = some_op();
tribool y = some_other_op();
if (x && y) {
  // both x and y are true
}
else if (!(x && y)) {
  // either x or y is false
}
else {
  // neither x nor y is false, but we don't know that both are true
  if (x || y) {
    // either x or y is true
  }
}

Аналогично<tribool>поддерживает 3-государственные сравнения равенства через операторов<==>и<!=>. Эти операторы отличаются от операторов «нормального» равенства в C++, потому что они возвращают<tribool>, потому что потенциально мы можем не знать результат сравнения (попробуйте сравнить<true>и<indeterminate>). Например:

tribool x(true);
tribool y(indeterminate);
assert(x == x); // okay, x == x returns true
assert(x == true); // okay, can compare tribools and bools

Ключевое слово<indeterminate>(представляющее значение<indeterminate>& #160;<tribool>) удваивается как функция для проверки того, является ли значение<tribool>неопределенным, например,

tribool x = try_to_do_something_tricky();
if (indeterminate(x)) {
  // value of x is indeterminate
}
else {
  // report success or failure of x
}

Все логические операторы и методы<tribool>помечены как<constexpr>в C++11. Это означает, что<tribool>может использоваться для составления выражений времени:

constexpr tribool x = (tribool(true) || tribool(indeterminate));
static_assert(x, "Must be true!");
[Note] Note
Some compilers may have troubles with evaluating tribool::operator safe_bool() at compile time.

Renaming the indeterminate state

Пользователи могут вводить дополнительные ключевые слова для неопределенного значения в дополнение к предоставленной реализации<indeterminate>с использованием макроса<BOOST_TRIBOOL_THIRD_STATE>. Например, в следующей макроинстанциации (в глобальном масштабе) ключевое слово<maybe>будет синонимом<indeterminate>(также находящегося в пространстве имен<boost>):

BOOST_TRIBOOL_THIRD_STATE(maybe)
tribool x = maybe;
if (maybe(x)) { /* ... */ }

tribool input/output

<tribool>объекты могут считываться и записываться в потоки путем включения заголовка<boost/logic/tribool_io.hpp>способом, очень похожим на<bool>значения. Когда флаг<boolalpha>не установлен на потоке ввода/вывода, интегральные значения 0, 1, и 2 соответствуют<tribool>значениям<false>,<true>и<indeterminate>соответственно. Когда<boolalpha>устанавливается на поток, произвольные строки могут использоваться для представления трех значений, причем по умолчанию они являются «ложными», «истинными» и «неопределенными». Например:

tribool x;
cin >> x; // Type "0", "1", or "2" to get false, true, or indeterminate
cout << boolalpha << x; // Produces "false", "true", or "indeterminate"

<tribool>вход и выход чувствительны к текущей локации потока. Струны, связанные с ложными и истинными значениями, содержатся в стандартной<std::numpunct>грани, а струна, именующая неопределенный тип, содержится в<indeterminate_name>грани. Чтобы заменить название неопределенного состояния, вам нужно пропитать свой поток локальным, содержащим<indeterminate_name>грань, например:

BOOST_TRIBOOL_THIRD_STATE(maybe)
locale global;
locale test_locale(global, new indeterminate_name<char>("maybe"));
cout.imbue(test_locale);
tribool x(maybe);
cout << boolalpha << x << endl; // Prints "maybe"

Если реализация стандартной библиотеки C++ не поддерживает локализации,<tribool>ввод/вывод все равно будет работать, но вы не сможете настроить строки, напечатанные/спаренные при установке<boolalpha>.


PrevUpHomeNext

Статья Tutorial раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 21. Boost.Tribool может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 21. Boost.Tribool ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:56:18/0.02888298034668/1