% BETWEEN % AND % als infix makro



  • Hey ...

    wir alle kennen sowas:

    int x = 1;
    int y = 2;
    int z = 3;
    
    if (y > x && y < z)
    {
       // ...
    }
    

    Habe heute zufäligg davon gelesen, dass ich mit #define infix-Expressiones bauen kann (http://stackoverflow.com/questions/15632217/defining-new-infix-operators).

    Jetzt würde ich mir gern eine Expression schreiben, die das hier unterstützt:

    int x = 1;
    int y = 2;
    int z = 3;
    
    if (y between x and z)
    {
       // ...
    }
    

    Irgendwelche Ideen?

    mfg, guni



  • http://ideone.com/CmqeiP
    Muss Capslock sein, da and ein Schluesselwort ist.



  • Als Spielerei und Grenz-Erkundung von C++ ist das ja ganz nett, aber ich hoffe schwer, ihr habt nicht vor, solche Konstrukte produktiv einzusetzen...



  • Wenn man unbedingt so etwas will, sollte man dies wenigstens nicht als Makro machen. Eine Möglichkeit ist das Verwenden eines Hilfskonstruktes (würde ich an dieser Stelle zwar nicht verwenden, hatte aber schon vergleichbare Stellen gehabt, wo der Nutzen der Lesbarkeit höher als der Aufwand war).

    Ungeprüft

    class Integer
    {
        public:
            Integer(int value)
            : value(value)
            {}
    
            bool between(int from, int to)
            {
                return value>=from && value<=to;
            }
    
        private:
            int value;
    }
    
    int main()
    {
        int x = 1;
        int y = 2;
        int z = 3;
    
        if(Integer(y).between(x, z))
        {
           // ...
        }
    }
    


  • Nexus schrieb:

    Als Spielerei und Grenz-Erkundung von C++ ist das ja ganz nett, aber ich hoffe schwer, ihr habt nicht vor, solche Konstrukte produktiv einzusetzen...

    Ja. Es soll eine reine Spielerei und Grenz-Erkundung sein; das triffts genau 😉
    Aber die Antwort wirft trotzdem eine Frage auf: was würde gegen produktiven Einsatz sprechen? (Wenn man mal davon absieht, dass die tyüesaftey flöten geht und das debugging übel wird)



  • guni schrieb:

    was würde gegen produktiven Einsatz sprechen? (Wenn man mal davon absieht, dass die tyüesaftey flöten geht und das debugging übel wird)

    Alleine die beiden Nachteile wären für mich schon ein sehr guter Grund dafür. Davon abgesehen das Makros noch unschöne Nebeneffekte haben können. Wenn ich eine Between Funktionalität haben will, nehme ich eine etwas unschönere Syntax, dafür ohne eben diese Nachteile in Kauf (Wobei ich in dem Fall nicht zu der von mir angegebenen Klasse, sondern eher einer freien Funktion mit 3 Argumenten tendieren würde).



  • Vorteile:

    • Minimal schönere Syntax, und das nur subjektiv

    Nachteile:

    • Braucht massiv mehr Code und Zeit für die Implementierung
    • Schwieriger zu debuggen
    • Schwieriger zu warten
    • Weniger typsicher
    • Niemand versteht den Code
    • Potentiell höhere Kompilierzeit und Möglichkeit, dass der Compiler nicht alles wegoptimiert
    • Unschöne Makro-Effekte, wenn man nicht wahnsinnig aufpasst

    Die Frage des produktiven Einsatzes dürfte damit geklärt sein 🙂



  • Wo ist hier das Problem bezüglich Typsicherheit?



  • Na ja. Bei einem makro erkennt der compiler meines wissens nach nicht, ob die verwendeten datentypen stimmen => fehler zur laufzeit. Wie auch immer: meine frage war ursprünglich eher ob sowas machbar is; nicht primär ob es sinnvoll is ...



  • guni schrieb:

    Na ja. Bei einem makro erkennt der compiler meines wissens nach nicht, ob die verwendeten datentypen stimmen => fehler zur laufzeit. Wie auch immer: meine frage war ursprünglich eher ob sowas machbar is; nicht primär ob es sinnvoll is ...

    Der Prepro macht die Replacements und danach ist das ganz normaler C++ code als wären die makros nie da gewesen (für den Compiler). Da werden natürlich noch Warnungen (zum Beispiel: signed und unsigned gemischt) etc angezeigt.



  • Dann schreib ich i + 1 BETWEEN j << 1 AND k >> 2 und versuch die Fehlermeldungen zu entziffern. Solcher Firlefanz macht richtig Spaß, sofern man ausreichend masochistisch veranlagt ist.


Anmelden zum Antworten