Klasse automatisch in bool umwandeln



  • Hi,

    ist es möglich eine Klasse B automatisch in einen bool umzuwandeln, so dass man sowas wie

    B b;
    if (b) ...
    

    schreiben kann?



  • Man muss dafür den Cast-Operator in der Klasse überladen.

    Entweder man macht es klassisch:

    class MyClass
    {
        public:
            operator bool() const
            {
                 return myVar;
            }
        private:
            bool myVar;
    };
    

    Oder besser mit dem Safe-Bool-Idiom (damit verhindert man das versehentliche Eingliedern in arithmetische Operationen):

    class MyClass 
    { 
        public: 
            operator const void*() const 
            { 
                 if (myVar)
    				 return IrgendeinZeigerBeispielsweiseThis; 
    			 else
    			     return NULL;
            } 
        private: 
            bool myVar; 
    };
    


  • das problem mit operator (const) void* ist allerdings, dass dann auch so etwas funktioniert:

    MyClass c;
    delete c;
    

    das safe-bool-idiom wird am besten implementiert, indem man einen zeiger auf eine elementvariable (oder eine elementfunktion) zurückgibt UND operator== und operator!= überlädt (wenn == und != nicht sinnvoll sind, muss man sich einen trick überlegen, so dass deren aufruf einen compile-time-error ergibt)

    in C++0x wird das übrigens einfacher möglich sein, indem man einen expliziten operator bool definiert:

    //C++0x
    class MyClass
    {
    public:
      explicit operator bool () const { /* ... */ }
    };
    


  • queer_boy schrieb:

    das problem mit operator (const) void* ist allerdings, dass dann auch so etwas funktioniert: [...]

    Du hast Recht, es gibt keine wirklich schöne Lösung dafür. Auch wenn man wahrscheinlich eher nicht delete anwendet oder die Klasse in arithmetische Operationen eingliedert, stellt es durchaus eine Gefahr dar. Den Hack mit operator== finde ich allerdings auch nicht gerade schön. Wenn ich den Cast-Operator zu bool benötige, werde ich wohl operator void* (je nachdem sogar operator bool ) benutzen...

    queer_boy schrieb:

    in C++0x wird das übrigens einfacher möglich sein, indem man einen expliziten operator bool definiert:

    Was ändert sich durch das explicit ? Kann man die Klasse als boolschen Ausdruck interpretieren, aber ansonsten wäre ein Cast notwendig?



  • explicit bedeutet (wird bedeuten) in dem fall, dass es zwar eine konvertierungsmöglichkeit nach X gibt, die aber nur explizit (also mit cast) möglich ist;

    gleichzeitig wird die explizite typumwandlung nach bool in (neu eingeführten) bool-kontexten automatisch durchgeführt. so ein bool-kontext ist z.b. der kopf einer while-schleife.


Log in to reply