template<double X>



  • @Simon2

    An sich ist ein template natürlich eine gute Idee.
    Wenn man die Range noch variabel hält, dann hat mein eine universell einsetzbare Klasse.

    Ich bin nicht auf die templates eingegangen,
    weil er offsensichtlich sich nicht mit templates auskennt
    und "nur double Werte zwischen -90.0 und 90.0" haben möchte 🙂



  • Airdamn schrieb:

    ...
    weil er ... "nur double Werte zwischen -90.0 und 90.0" haben möchte 🙂

    Ich hatte das

    hanebuechen schrieb:

    ...
    Was ich eigentlich versuche zu machen, ist ein Limited/Ranged Datentyp, z.B. ...

    ein wenig umfassender verstanden - aber ist ja auch egal.

    Gruß,

    Simon2.



  • Wie oben schon gesagt wurde, gehoeren Fliesskommazahlen als templateparameter noch nicht zum Standard. Noch, denn soweit ich das mitbekommen habe ist sowas fuer den kommenden Standard in Diskussion.
    Bis dahin kannst du das Problem umgehen, indem du eine policy einfuehrst, die den Wert kapselt:

    struct DH90_0 { static const double val = 90.0; };
    struct DH4_5 { static const double val = 4.5; };
    
    template<class DblHolder>
    class Blah
    {
       double maxRange = DblHolder::val;
    ...
    };
    

    und dann beispielsweise

    Blah<DH90_0> myBlah;  //hier ist maxRange = 90.0
    

    Du kannst jederzeit wenn du es brauchst ein neues struct definieren, das den double Wert val definiert und dieses Struct an Stelle des double als template parameter uebergeben.
    Alternativ kannst du im template privat von DblHolder erben, dann ist val ein geerbtes privates member von Blah<>.



  • Simon2 schrieb:

    Wie Du selbst schon schreibst:

    hanebuechen schrieb:

    ..."'double' is not a valid type for template constant parameter"...

    Der Standard erlaubt einfach kein double als "Konstantenparameter".
    Ich glaube, Du hast auch den "Konstantenparameter" von templates missverstanden.

    Ich suche eigentlich nach der Begründung warum mein Besipiel mit int funktioniert/erlaubt ist und mit double nicht? Die Aussage "Der Standard erlaubt es nicht" ist eigentlich nicht das, was ich hören wollte, sondern warum es nicht erlaubt ist.

    Simon2 schrieb:

    Wie wär's mit:

    template <typename T>
    class ranged {
       T value, maxValue, T minValue;
       void checkRange(T val) { if(val > maxValue || val < minValue) throw out_of_range(); }
    public:
       ranged(T initVal, T maxVal, T minVal) : 
          maxValue(maxVal),
          minValue(minVal) { set(init); }
       void set(T val) { checkRange(initVal); value = initVal; }
    };
    
    int main() {
       ranged<int> i(0, -2, 30);
       i.set(7);
       i.set(34);
       ...
    }
    

    Der Vorschlag ist nicht, was ich erreichen will. Ich möchte Typen ausprägen können, die NICHT zuweisungskompatibel sind. Mit deiner ranged Klasse kann man folgendes machen:

    {
      ranged<double> latitude(0.0, -90.0, 90.0);
      ranged<double> longitude(0.0, -180.0, 180.0);
      latitude = longitude; // Kein Problem
    }
    

    Ich möchte sowas erreichen:

    {
      typedef TypTemplate<double, -90.0, 90.0> Latitude;
      typedef TypTemplate<double, -180.0, 180.0> Longitude;
    
      Latitude lat(10.0);
      Longitude lon(20.0);
    
      lat = lon; // Kompiler Error soll erzeugt werden.
    }
    


  • EDIT: Dieser Post bezieht sich auf pumuckls Anmerkung...

    Oh - das ist auch schön !! 👍 😋

    ... kommt allerdings ein wenig darauf an, wie solcher "structs" man braucht. Das wird schnell unübersichtlich, wenn es zu viele sind ...

    Aber bei wenigen ist das eine schöne Gelegenheit, "verbotene Mischungen" vom Compiler angezeigt zu bekommen.

    Gruß,

    Simon2.



  • hanebuchen schrieb:

    Simon2 schrieb:

    Wie Du selbst schon schreibst:

    hanebuechen schrieb:

    ..."'double' is not a valid type for template constant parameter"...

    Der Standard erlaubt einfach kein double als "Konstantenparameter".
    Ich glaube, Du hast auch den "Konstantenparameter" von templates missverstanden.

    Ich suche eigentlich nach der Begründung warum mein Besipiel mit int funktioniert/erlaubt ist und mit double nicht? Die Aussage "Der Standard erlaubt es nicht" ist eigentlich nicht das, was ich hören wollte, sondern warum es nicht erlaubt ist.

    Tröstet es dich, wenn ich dir sage, dass du als Template-Parameter eine Referenz bzw. einen Zeiger auf ein double angeben kannst?



  • hanebuchen schrieb:

    Ich suche eigentlich nach der Begründung warum mein Besipiel mit int funktioniert/erlaubt ist und mit double nicht? Die Aussage "Der Standard erlaubt es nicht" ist eigentlich nicht das, was ich hören wollte, sondern warum es nicht erlaubt ist.

    Die einfache Antwort: historische Gruende. Irgendwann wurden Ints als Templateparameter eingefuehrt, offenbar weil die Notwendigkeit bestand - fuer doubles jedoch noch nicht. Heute stellen sich viele Leute die gleiche Frage wie du auch, unter anderem auch Mitglieder des Standardisierungskommitees - und deshalb werden doubles wohl auch "demnaechst" eingefuehrt. (einige Compiler koennen sie evtl. auch schon)

    Die nicht zuweisungskompatiblen Typen erreichst du mit meinem obigen Beispiel. du kannst damit sogar noch etwas weiter gehen:

    struct DH90_0a { static const double val = 90.0; };
    struct DH90_0b { static const double val = 90.0; };
    
    ranged<DH90_0a> rangeda;
    ranged<DH90_0b> rangedb;
    ragenda = rangedb; // FEHLER obwohl die Range die gleiche ist!
    

    Damit kannst du beispielsweise verschiedene Parameterraeume voneinander unterscheiden, auch wenn sie die gleiche Range haben. (z.B. geographische Breite, galaktische Breite, die Wineklskala auf einem Geodreieck, was weiss ich 😉 )



  • pumuckl schrieb:

    ...
    Damit kannst du beispielsweise verschiedene Parameterraeume voneinander unterscheiden, auch wenn sie die gleiche Range haben. (z.B. geographische Breite, galaktische Breite, die Wineklskala auf einem Geodreieck, was weiss ich 😉 )

    Danke für die Antwort. Wann ist eigentlich Stichtag für den neuen Standard? 🙂 Ich höre jetzt schon gefühlte 100 Jahre davon... 😉

    Gruß, Hanebuechen



  • ich hab mal was gehoert von "2007 vorgestellt, 2009 verabschiedet und 2010 dann eingefuehrt" - alle Angaben ohne Gewaehr 😉



  • hanebuchen schrieb:

    ...
    Der Vorschlag ist nicht, was ich erreichen will. ...

    Sorry, das war mir nicht klar - liegt ein wenig daran, dass ich Dich nicht kenne. Es gibt hier genug Fragesteller, die das nicht wissen (und bei Unregistrierten kann man eben keine "Erfahruzngswerte" aufbauen 😃 ).

    Funktioniert denn punuckls Ansatz für Dich ?

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Funktioniert denn punuckls Ansatz für Dich ?

    Yep. Nicht ganz so wie ich's gern hätte, aber so gehts auf alle Fälle. Ich hoffe aber trotzdem dass im neuen Standard Templates mit konstanten Doubles möglich sind... 🙂

    Gruß, Hanebuechen


Anmelden zum Antworten