viele ähnliche objekte



  • dot schrieb:

    Ne wird nicht

    Ach ja, sorry! Das war, wenn derived den CTor von base aufruft und dann dieser Pure-Virtual-Funktionen aufruft.



  • EOutOfResources schrieb:

    Ach ja, sorry! Das war, wenn derived den CTor von base aufruft und dann dieser Pure-Virtual-Funktionen aufruft.

    Ja, in dem Fall würds in die Hose gehn weil das Objekt zu dem Zeitpunkt noch den Typ der Basisklasse hat da der abgeleitete Teil noch nicht fertig konstruiert ist.



  • @lol_of_lolcraft Als Template-Argument schon mal const float& genutzt? Könnte helfen...



  • EOutOfResources schrieb:

    @lol_of_lolcraft Als Template-Argument schon mal const float& genutzt? Könnte helfen...

    Hast du ja selbst grade festgestellt, dass es nicht geht 😉



  • lol_of_lolcraft schrieb:

    ich suche eine möglichkeit das zu machen

    Den float -Parameter im Konstruktor des Funktors anzugeben ist dir zu kompliziert?



  • pumuckl schrieb:

    EOutOfResources schrieb:

    @lol_of_lolcraft Als Template-Argument schon mal const float& genutzt? Könnte helfen...

    Hast du ja selbst grade festgestellt, dass es nicht geht 😉

    Wieso sollte das nicht gehen?
    Es ist nur bäh, weil der float-Wert dann nichtmehr Compiletime-Konstant ist, und dadurch Berechnungen mit dem Wert u.U. nicht optimiert werden können.

    Und instanzieren muss man dann natürlich anders, da man halt eine Lvalue braucht wenn daraus ein (Lvalue-)Referenz-Template-Parameter werden soll. D.h. man kann nichtmehr einfach nen Float-Literal hinschreiben, sondern muss das Ding irgendwo als Konstante definieren, und dann den Namen der Konstante verwenden.

    Siehe: http://www.c-plusplus.net/forum/p2083651#2083651



  • hustbaer schrieb:

    Und instanzieren muss man dann natürlich anders, da man halt eine Lvalue braucht wenn daraus ein (Lvalue-)Referenz-Template-Parameter werden soll. D.h. man kann nichtmehr einfach nen Float-Literal hinschreiben, sondern muss das Ding irgendwo als Konstante definieren, und dann den Namen der Konstante verwenden.

    Das ist eigentlich inkonsistent. Normalerweise kann man Referenzen auf const auch mit temporären Ausdrücken initialisieren.

    const float& f = 4.2f;
    


  • Alternative 1:

    Statt "viele ähnliche Klassen" zu benutzten, reicht auch eine einzige, die den float-Wert speichert.

    Alternative 2:

    Es werden nun einmal keine Fließkommawerte als Template-Parameter unterstützt. Ich schätze, das wirft einfach zu viele Probleme auf bzgl Rechenungenauigkeiten. Du kannst aber Referenzen auf Objekte mit externer Bindung als Template-Parameter verwenden:

    extern const float magic = 9.87654321f;
    
    template<const float& CF>
    struct foo {
      float operator()(float x) {return x*CF;}
    };
    
    foo<magic> f;
    

    Alternative 3:

    Und falls Du Makros und Lambdas verwenden darfst/kannst:

    #define MUL(f) [](float x){return x*f;}
    auto mul_e  = MUL(2.71828183f);
    auto mul_pi = MUL(3.14159265f);
    ...
    


  • Nexus schrieb:

    hustbaer schrieb:

    Und instanzieren muss man dann natürlich anders, da man halt eine Lvalue braucht wenn daraus ein (Lvalue-)Referenz-Template-Parameter werden soll. D.h. man kann nichtmehr einfach nen Float-Literal hinschreiben, sondern muss das Ding irgendwo als Konstante definieren, und dann den Namen der Konstante verwenden.

    Das ist eigentlich inkonsistent. Normalerweise kann man Referenzen auf const auch mit temporären Ausdrücken initialisieren.

    const float& f = 4.2f;
    

    Selbst wenn es erlaubt wäre, würde das bei const-ref Template Parametern keinen Sinn machen.
    Das float an das die Referenz gebunden wird wäre bei jeder Instanzierung des Templates ein anderes, d.h. es gäbe viele verschiedene Template-Instanzen, obwohl der Wert in der float Konstante jedesmal gleich wäre.



  • krümelkacker schrieb:

    Alternative 3:

    Und falls Du Makros und Lambdas verwenden darfst/kannst:

    #define MUL(f) [](float x){return x*f;}
    auto mul_e  = MUL(2.71828183f);
    auto mul_pi = MUL(3.14159265f);
    ...
    

    was ist hier der Vorteil gegenueber:

    float MUL(float x) { return x*f; }
    auto mul_e  = MUL(2.71828183f);
    auto mul_pi = MUL(3.14159265f);
    

    ?


Anmelden zum Antworten