Die Boost C++ Bibliotheken

Kapitel 72. Boost.Operators

Boost.Operators stellt zahlreiche Klassen zur Verfügung, mit denen Operatoren automatisch überladen werden können. So wird im Beispiel 72.1 einer Klasse automatisch ein Größer-als-Operator hinzugefügt, weil dieser mit Hilfe des in der Klasse definierten Kleiner-als-Operators implementiert werden kann.

Beispiel 72.1. Größer-als-Operator mit boost::less_than_comparable definieren
#include <boost/operators.hpp>
#include <string>
#include <utility>
#include <iostream>

struct animal : public boost::less_than_comparable<animal>
{
  std::string name;
  int legs;

  animal(std::string n, int l) : name{std::move(n)}, legs{l} {}

  bool operator<(const animal &a) const { return legs < a.legs; }
};

int main()
{
  animal a1{"cat", 4};
  animal a2{"spider", 8};

  std::cout << std::boolalpha << (a2 > a1) << '\n';
}

Um Operatoren einer Klasse automatisch hinzuzufügen, muss diese von Klassen abgeleitet werden, die Boost.Operators in der Headerdatei boost/operators.hpp zur Verfügung stellt. Wenn eine Klasse wie im Beispiel 72.1 von boost::less_than_comparable abgeleitet wird, werden automatisch die Operatoren operator>, operator<= und operator>= definiert.

Ein automatisches Überladen von Operatoren ist möglich, weil viele Operatoren durch andere Operatoren ausgedrückt werden können. So implementiert boost::less_than_comparable zum Beispiel den Größer-als-Operator als das Gegenteil des Kleiner-als-Operators: Wenn ein Objekt nicht kleiner als ein anderes ist, muss es größer sein.

boost::less_than_comparable setzt voraus, dass es keine gleichen Objekte gibt. Wenn es gleiche Objekte geben kann, darf nicht von boost::less_than_comparable abgeleitet werden. In diesem Fall muss boost::partially_ordered als Elternklasse verwendet werden. Dazu muss der Operator operator== definiert werden, so dass boost::partially_ordered feststellen kann, ob nicht kleiner größer oder gleich bedeutet.

Neben boost::less_than_comparable und boost::partially_ordered werden zahlreiche weitere Klassen angeboten, um nicht nur Vergleichsoperatoren automatisch zu überladen, sondern auch arithmetische und logische Operatoren. Darüber hinaus stehen Klassen zur Verfügung, um Operatoren zu überladen, wie sie üblicherweise von Iteratoren, Zeigern oder Arrays angeboten werden. Da ein automatisches Überladen immer nur möglich ist, wenn andere Operatoren bereits definiert sind, hängt es von Fall zu Fall ab, welche Operatoren Sie vorgeben müssen. Hier hilft nur ein Blick in die Dokumentation.