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.
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.