Operatoren mithilfe von Templates generieren, macht es Sinn?



  • Mit boost.operators lassen sich Operatoren gezielt fuer eine Klasse generieren.



  • Kellerautomat schrieb:

    Mit boost.operators lassen sich Operatoren gezielt fuer eine Klasse generieren.

    Gibt auch einen Artikel darueber von pumuckl.
    Darueber hinaus sei auch std::rel_ops nicht unerwaehnt.



  • Danke für die zahlreichen Antworten, hat mir sehr geholfen 🙂



  • Cyres schrieb:

    Hi,
    ...

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
    	if (lhs < rhs)
    		return false;
    	return lhs != rhs;
    }
    

    Das ginge einfacher:

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return rhs < lhs;
    }
    


  • ich bins schrieb:

    Das ginge einfacher:

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return rhs < lhs;
    }
    

    [/quote]

    ähm... nein. Was ist bei Gleichheit?



  • ich bins schrieb:

    Das ginge einfacher:

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return rhs < lhs;
    }
    

    Dieser Operator macht aber genau das Gegenteil vom Erwarteten.
    Eher

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return !(rhs <= lhs);
    }
    

    wenn man schon > nicht direkt verwenden will.


  • Mod

    <(lhs,rhs)
    >(lhs,rhs)  =>  rhs<lhs
    <=(lhs,rhs) =>  !(rhs<lhs)
    >=(lhs,rhs) =>  !(lhs<rhs)
    ==(lhs,rhs) =>  !(lhs<rhs)&&!(rhs<lhs)
    !=(lhs,rhs) =>  !(lhs==rhs)  => (lhs<rhs)||(rhs<lhs)
    

    Wenn nicht eine gewisse Symmetrie auftritt, ist wahrscheinlich ein Fehler gemacht worden.



  • Braunstein schrieb:

    ich bins schrieb:

    Das ginge einfacher:

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return rhs < lhs;
    }
    

    Dieser Operator macht aber genau das Gegenteil vom Erwarteten.
    Eher

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return !(rhs <= lhs);
    }
    

    wenn man schon > nicht direkt verwenden will.

    Also wenn lhs 17 und rhs 5 ist, dann ist 17>5 true und 5<17 auch true. 5<=17 ergibt true und damit !(5<=17) false.

    Wenn A>B => B<A.

    Oder nicht?



  • daddy_felix schrieb:

    ich bins schrieb:

    Das ginge einfacher:

    template<class T, class U>
    inline bool operator>(const T& lhs, const U& rhs)
    {
            return rhs < lhs;
    }
    

    ähm... nein. Was ist bei Gleichheit?[/quote]

    was soll dann sein?
    lhs > rhs genau dann wenn rhs < lhs. alles gut so wie es ist.



  • Hast recht, ich hab nicht auf rhs und lhs geachtet.


Anmelden zum Antworten