Die Boost C++ Bibliotheken

Kapitel 27. Boost.Tribool

Die Bibliothek Boost.Tribool bietet mit boost::logic::tribool einen Typ an, der bool ähnelt. Während bool zwischen zwei Status unterscheidet, kennt boost::logic::tribool jedoch drei.

Um boost::logic::tribool verwenden zu können, müssen Sie die Headerdatei boost/logic/tribool.hpp einbinden.

Beispiel 27.1. Drei Status von boost::logic::tribool
#include <boost/logic/tribool.hpp>
#include <iostream>

using namespace boost::logic;

int main()
{
  tribool b;
  std::cout << std::boolalpha << b << '\n';

  b = true;
  b = false;
  b = indeterminate;
  if (b)
    ;
  else if (!b)
    ;
  else
    std::cout << "indeterminate\n";
}

Eine Variable vom Typ boost::logic::tribool kann auf true, false und indeterminate gesetzt werden. Der Standardkonstruktur initialisiert die Variable mit false. So gibt Beispiel 27.1 zuerst false auf die Standardausgabe aus.

Die if-Kontrollstruktur im Beispiel 27.1 zeigt Ihnen, wie b richtig abgefragt wird. Sie müssen explizit auf true und false überprüfen. Ist wie im Beispiel die Variable auf indeterminate gesetzt, wird der else-Block ausgeführt.

Boost.Tribool bietet auch eine Funktion boost::logic::indeterminate() an. Wenn Sie dieser Funktion eine Variable vom Typ boost::logic::tribool übergeben, die auf indeterminate gesetzt ist, wird true zurückgegeben. Ist die Variable auf true oder false gesetzt, wird false zurückgegeben.

Beispiel 27.2. Logische Operatoren mit boost::logic::tribool
#include <boost/logic/tribool.hpp>
#include <boost/logic/tribool_io.hpp>
#include <iostream>

using namespace boost::logic;

int main()
{
  std::cout.setf(std::ios::boolalpha);

  tribool b1 = true;
  std::cout << (b1 || indeterminate) << '\n';
  std::cout << (b1 && indeterminate) << '\n';

  tribool b2 = false;
  std::cout << (b2 || indeterminate) << '\n';
  std::cout << (b2 && indeterminate) << '\n';

  tribool b3 = indeterminate;
  std::cout << (b3 || b3) << '\n';
  std::cout << (b3 && b3) << '\n';
}

So wie auf Variablen vom Typ bool können auch auf Variablen vom Typ boost::logic::tribool logische Operatoren angewandt werden. Genaugenommen ist dies die einzige Möglichkeit, mit Variablen vom Typ boost::logic::tribool zu arbeiten. Die Klasse bietet keine Methoden an.

Wenn Sie Beispiel 27.2 ausführen, sehen Sie, dass für b1 || indeterminate true, für b2 && indeterminate false und für alle anderen Fälle indeterminate zurückgegeben wird. Wenn Sie sich die Operationen und ihre Ergebnisse im Detail ansehen, stellen Sie fest, dass sich boost::logic::tribool so verhält, wie man es intuitiv erwarten würde. Sie finden in der Dokumentation von Boost.Tribool jedoch auch Tabellen, die anzeigen, welche Verknüpfungen mit welchen Operatoren zu welchen Ergebnissen führen.

Beispiel 27.2 zeigt auch, wie für Variablen vom Typ boost::logic::tribool true, false oder indeterminate auf die Standardausgabe ausgegeben wird. Dazu muss die Headerdatei boost/logic/tribool_io.hpp eingebunden und das Flag std::ios::boolalpha für die Standardausgabe gesetzt werden.

Boost.Tribool bietet außerdem ein Makro BOOST_TRIBOOL_THIRD_STATE an, mit dem ein anderer Wert als indeterminate verwendet werden kann. So könnte zum Beispiel dontknow anstatt indeterminate geschrieben werden.