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



  • 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.



  • Shade Of Mine schrieb:

    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:

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

    Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

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


  • stimmt. sorry.
    hab das aus dem gedächtnis geschrieben 😞



  • Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

    das typename verstehe ich und ist auch logisch, aber wann muss man templates explizit qualifizieren? Wozu? Und welcher Compiler verlangt das? (Meine üblichen Compiler übersetzen sowohl mit, als auch ohne anstandslos).



  • Helium schrieb:

    Nicht ganz konform. Fehlt ein typename und ein template. So ist's richtig:

    das typename verstehe ich und ist auch logisch, aber wann muss man templates explizit qualifizieren?

    Ähnlich wie bei typename. Wann immer du in einem Template (Funktion oder Klasse) ein Membertemplate eines von einem Templateparameter (des Templates) abhängigen Typs ansprechen willst.

    Wozu?

    Um dem Compiler mitzuteilen, dass es sich bei dem nachfolgenden Namen um ein Template handelt. Ansonsten gilt: Ein abhängiger Name ist niemals ein Template, es sei denn er wird explizit als solcher gekennzeichnet.
    Genauso wie für typename gilt: "Ein abhängiger Name ist niemals ein Typ, es sei denn er wird explizit also solcher gekennzeichnet".

    Klassisches Beispiel:

    extern int a;
    template <class AType>
    void Func(AType obj)
    {
        obj.anotherFunc<3>(a);
    }
    

    Da der Compiler in der ersten Phase nichts über AType weiß, nimmt er an, dass anotherFunc ein Member von AType ist. Die Zeile ist so also nicht weiter als ein Vergleich. Kein Funktionsfaufruf.

    extern int a;
    template <class AType>
    void Func(AType obj)
    {
        obj.template anotherFunc<3>(a);
    }
    

    Jetzt hingegen weiß der Compiler, dass antoherFunc ein Membertemplate ist. Jetzt hast du also einen Funktionsaufruf der Funktion anotherFunc, die offensichtlich einen non-Type-Template-Parameter sowie ein Argument erwartet.

    Und welcher Compiler verlangt das?

    Jeder standardkonforme 🙂
    Der Comeau z.B. Und soweit ich weiß auch die neueren gccs.


Anmelden zum Antworten