Können funktionen schon beim kompilieren ausgeführt werden?



  • defob schrieb:

    Spielerei? pohhh 😮

    Ich hab gesagt oft, nicht immer.



  • Hmm wofür braucht man denn so etwas? *unwissend ist*
    Dann kannst du es doch gleich zu Fuss errechnen und den Wert eingeben und dann kompilieren?



  • Gast1001 schrieb:

    Hmm wofür braucht man denn so etwas? *unwissend ist*
    Dann kannst du es doch gleich zu Fuss errechnen und den Wert eingeben und dann kompilieren?

    Ja also, wenn du Fakultaet von 10 auswenfig weißt, dann ist ja gut. Das ist ja auch mehr zu rVeranschaulichung. Lies mal Modern C++ Design: Generic Programming and Design Patterns Applied
    by Andrei Alexandrescu (Author)



  • Warum soll ich das lesen, wovon handelt das?

    Außerdem ist es doch dämlich funktionen (egal ob iterativ oder rekursiv) einzubauen die dir dann die fakultät berechnen, da kann ich doch eben den windowstaschenrechner nutzen und gut ist?!

    Ich seh den sinn net

    😕



  • Gast1001 schrieb:

    Warum soll ich das lesen, wovon handelt das?

    Außerdem ist es doch dämlich funktionen (egal ob iterativ oder rekursiv) einzubauen die dir dann die fakultät berechnen, da kann ich doch eben den windowstaschenrechner nutzen und gut ist?!

    Ich seh den sinn net

    😕

    Es wird schon zur Compilezeit berechnet. Es wird nicht mehr zur Ausführung berechnet. Frag mal HumeSikkins http://bens.c-plusplus.info/

    Der kann dir mehr zu TemplateMetaProgramming erzählen.



  • Aber warum?!

    Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein



  • Der Rechner berechnet es doch.



  • Hi,

    schau mal hier auf c-plusplus.net.

    Marc++us hatte glaub ich mal eine PDF zum Thema Template Metaprogrammierung veröffentlicht.

    ChrisM



  • Gast1001 schrieb:

    Aber warum?!

    Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein

    Fakultaet ist natuerlich Sinnlos. da gebe ich dir recht.

    Aber nimm zB mal Expressiontemplates.
    Hier wird eine Expression zerlegt und als ganzes Ausgewertet, statt als einzelne Teile mit temporären Ergebnissen.

    Angenommen x und y sind Arrays und der ausdrueck
    2*x
    multipliziert alle Elemente von x mit 2 und liefert ein array zurück.
    1.2*x + x*y;
    wird zB zu folgendem
    Add<Mult<Scalar<double>, Array<double> >, Mult<Array<double>, Array<double> > >
    Hier gibt es keine temporären ergebnisse die sinnlos kopiert werden müssen

    In 'C++ Templates' lernst du eine Menge über Templates und ihren sinnvollen einsatz.





  • Shade Of Mine schrieb:

    Gast1001 schrieb:

    Aber warum?!

    Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein

    Fakultaet ist natuerlich Sinnlos. da gebe ich dir recht.

    Aber sehr einfach zu verstehen.



  • Also ich finde Fac<5> im Code eindeutiger als 120, und schneller als den Taschenrechner zu öffnen und das Ergebnis rüberzukopieren ist es auch - davon abgesehen, dass man ja nicht unbedingt direkt ein Literal an Fac<> übergeben muss. Aber ein nicht-metaprogrammiertes Fac<> wird ein guter Compiler wohl auch ausrechnen, wenn's geht...



  • @operator void
    bei solchen trivialen Sachen lohnt sich IMHO die Compile-Zeit verlängerung nicht, die durch Template Meta Programmierung teilweise recht enorm sein kann.

    Da würde ich lieber einen Kommentar im Quellcode einfügen, der angibt warum die 120 da steht.



  • kingruedi schrieb:

    Da würde ich lieber einen Kommentar im Quellcode einfügen, der angibt warum die 120 da steht.

    exakt!

    sinn macht Fact<> nur dann, wenn es Teil einer Library ist, in der Fact<> abhaengig von den angaben des programmierers berechnet werden muss.



  • man brauch ja noch nichtmal nen Kommentar

    const int fakultaet_von_5=120
    
    void foo() {
      bar(fakultaet_von_5);
    }
    

    ist ja auch recht eindeutig 🙂



  • Ob das Starten des Taschenrechners, Ausrechnen des Werts, hinzufügen der Konstante und die tatsächliche Verwendung von dem kleinen Kompilierungsboost mal ausgeglichen werden, hängt dann wohl davon ab, wie oft man seinen Code kompiliert...



  • kingruedi schrieb:

    man brauch ja noch nichtmal nen Kommentar

    const int fakultaet_von_5=120
    
    void foo() {
      bar(fakultaet_von_5);
    }
    

    ist ja auch recht eindeutig 🙂

    Der war gut.



  • Hallo liebe Experten des Template Meta Programmierung,
    wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?
    Der Compiler von Windows ist nicht wirklich standartkonform.
    Beispielsweise scheint partielle Spezialisierung nur bedingt möglich.



  • titus78 schrieb:

    Hallo liebe Experten des Template Meta Programmierung,
    wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?

    eine standardkonforme variante oder eine non-konforme?

    hier die standard konforme:

    namespace hidden
    {
    template<bool condition>
    struct IfThenElseImpl
    {
      template<class Then, class Else>
      struct inner
      {
        typedef Then result;
      };
    };
    
    template<>
    struct IfThenElseImpl<false>
    {
      template<class Then, class Else>
      struct inner
      {
        typedef Else result;
      };
    };
    }
    
    template<bool condition, class Then, class Else>
    struct IfThenElse
    {
      typedef hidden::IfThenElseImpl<condition>::inner<Then, Else>::result result;
    };
    


  • Ok, danke für die Antworten:
    Ich werd mich bei Gelegenheit mal damit beschäftigen, aber ich denke für meine Zwecke ist es wirklich einfacher per Hand zu rechnen.


Anmelden zum Antworten