Modernes C++ programmieren

Okt 23, 2024

lst-0444-book.cpp

// https://godbolt.org/z/ojeh8Gzcx 
#include <iostream>               // istream, ostream, cout
class Bool {
    bool val_ = false;
    bool& operator*()             // dereferenzieren; veränderbar
        { return val_; };
    const bool& operator*() const // dereferenzieren; nur lesen
        { return val_; }
public:
    constexpr Bool() {}
    explicit constexpr Bool(bool value)
        : val_{value} {}
    // einstellige Operatoren
    Bool operator!() const        // Nicht-Operator
        { return Bool{!val_}; };
    // zweistellige Operatoren
    friend Bool operator&&(const Bool &re, const Bool &li)
        { return Bool{*re && *li}; }
    friend Bool operator||(const Bool &re, const Bool &li)
        { return Bool{*re || *li}; }
    // Ein- und Ausgabe
    friend std::ostream& operator<<(std::ostream& os, const Bool& arg);
    friend std::istream& operator>>(std::istream& is,  Bool& arg);
};
std::ostream& operator<<(std::ostream& os, const Bool& arg)
    { return os << *arg; }
std::istream& operator>>(std::istream& is, Bool& arg)
    { return is >> *arg; }
// Konstanten
static constexpr Bool False{false};
static constexpr Bool True{true};
int main() {
    Bool jein = True && ( Bool{false} || !Bool{} ); // verwendet &&, || und !
    std::cout << jein << "\n"; // Ausgabe: 1
}