Metaprogrammierung in C++



  • Hallo,
    den Begriff habe ich schon öfters im Zusammenhang mit C++ gesehen nur was das ist weiss ich nicht. Ich kenne das grob von Lisp aber wie das in C++ funktioniert habe ich bisher nicht herausfinden können, selbst in vielen C++ Büchern taucht dazu nichts auf. Selbst einige C++-"Profis" können mit dem Begriff absolut gar nichts (!) anfangen.

    Kann mir jemand ein Buch empfehlen das die 'sophisticated features' von C++ wie eben Metaprogrammierung erklärt?



  • Ein einfaches Beispiel:

    #include <iostream>
    using std::cout;
    
    template< int base, int exp >
    struct static_pow
    {
    	enum{ result = base * static_pow< base, exp - 1 >::result };
    };
    
    template< int base >
    struct static_pow< base, 0 >
    {
    	enum{ result = 1 };
    };
    
    int main()
    {
    	cout << static_pow< 3, 2 >::result;
    }
    


  • Also
    Metaprogrammierung = Templates verwenden?

    Dein Bsp. ist mir neu, ich kenne Templates nur von Klassen und Funktionen.
    Was bedeutet denn dieses ::result? Ich kann mir denken was es macht, aber
    rein syntaktisch sieht das ungewöhnlich aus.

    Ich hätte dein Bsp. mit einer Funktion erledigt, wo ist jetzt der Vorteil?
    Ich vermute mal deine Potenz wird schon zur Compiletime aufgelöst, richtig?

    Wann setzt man MP ein, wann nicht?



  • Richtig wird zur Compile-time gelöst.

    Naja einsetzen tut man es für sich alleine nicht so oft wie man vielleicht denkt wenn man die Metaprogrammierung für sich neu entdeckt. Man kann sie aber sinnvoll einsetzen, Beispiele findest du in dem Buch Modern C++ Design (die Bibliothek die darin entwickelt wird heißt Loki und ist bei sourceforge.net erhältlich).

    Mein Beispiel und viele andere der typischen Demonstrationen sind aber nur Spielerei.



  • anonymer user schrieb:

    Metaprogrammierung = Templates verwenden?

    Nicht ganz - Metaprogrammierung bedeutet, daß die Berechnungen schon vom Compiler durchgeführt werden (normale Funktionen werden erst zur Laufzeit berechnet). In C++ verwendet man dazu idR Templates, aber deswegen ist noch lange nicht jedes Template gleich ein Metaprogramm.



  • in wahrheit kann sogar schon ein ausdruck wie

    int i=1+1;
    

    metaprogrammierung sein, wenn der compiler auf die idee kommt, dass 1+1=2 ist. Leider tut er dies nicht sonderlich gerne, nach möglichkeit nur, wenn er dazu gezwungen wird(optimierungen aktiviert). Bei bestimmten template formen muss er solche ausdrücke aber auswerten, weil er sonst nicht weitermachen kann und dann arbeitet er auch fleissig.


Anmelden zum Antworten