Template Metaprogrammierung?



  • Hi,

    ich habe paar Fragen zu diesem Themengebiet:

    1. Wieso heißt Metaprogrammierung Metaprogrammierung?
    2. Ist Templatespezialisierung = Metaprogrammierung?
    3. Wie sieht ein Typischer fall von Metaprogrammierung aus?
    4. Wo findet es Verwendung?
    5. Was bedeutet Meta?
    6. Ist sowas meta-programmierung? Wenn ja wieso?

    // 2/PI
    template<typename T> struct inv2_pi  { static const T value; }; 
    template<> const float  inv2_pi<float> ::value = 0.63661977236758134308f; 
    template<> const double inv2_pi<double>::value = 0.6366197723675813430755350534901; 
    
    // Wurzelfunktion
    template<typename T> inline const T sqrt (T value)
    { return (static_cast<T>(std::sqrt(value))); }
    template<> inline const float sqrt (float value)
    {
        __asm { sqrtss    xmm0, value };
        __asm { movss    value, xmm0  };
        return (value);
    }
    

    7. Wo gibt es andere Beispiele zu diesem Themengebiet? (Links?)

    Schonmal danke im voraus



  • *push*

    Sind die Gurus etwa noch ihren Rausch am ausschlafen? 🙂



  • Da Guru schrieb:

    1. Wieso heißt Metaprogrammierung Metaprogrammierung?

    klingender name für nette techniken.
    du meta-programmierst, wenn du es schaffst, bestimmte ausdrücke zu compile-zeit auswerten zu lassen.
    metaprogrammierung ist also eine art übergeordnete programmierung. d.h. man kann mit metaprogrammierung programme schreiben, die sich bei der kompilierung noch selbst erstellen.

    2. Ist Templatespezialisierung = Metaprogrammierung?

    nein. nur weil irgendwo ein template spezialisiert wird, heißt das nicht, dass da schon jemand meta-programmiert.

    3. Wie sieht ein Typischer fall von Metaprogrammierung aus?

    immer wieder kommt

    template <int N>
    struct Factorial {
      static const int value = N * Factorial<N - 1>::value;
    };
    
    template <>
    struct Factorial<1> {
       static const int value = 1;
    };
    
    int main ()
    {
       cout << Factorial<10>::value << endl;
    }
    

    4. Wo findet es Verwendung?

    ganz nett z.b. für loop-unrolling. du kannst dir auch eine klassenhierarchie erstellen lassen (man lese Modernes C++ Design von Andrei Alexandrescu), ... das tolle an template metaprogrammierung ist, dass es turing vollständig ist und du damit im prinzip jeden beliebigen algorithmus realisieren kannst (und das zur compile-time)
    du kannst z.b. auch feststellen, ob ein typ von einem anderen abgeleitet ist.

    5. Was bedeutet Meta?

    siehe http://de.wikipedia.org/wiki/Griechische_Präpositionen (da ist sogar ein link zu "Metaprogrammierung" dabei 😉

    6. Ist sowas meta-programmierung? Wenn ja wieso?

    nicht wirklich, da zur compile-time nicht viel gemacht wird.

    7. Wo gibt es andere Beispiele zu diesem Themengebiet? (Links?)

    The Boost MPL Library, Modern C++ Design, http://en.wikipedia.org/wiki/Template_metaprogramming (- ein lesenswertes buch) und google natürlich 😉



  • Kauf dir Mordernes C++ Design und dir wird es wie Schuppen von den Augen fallen. Wo man es genau einsätzt kann man so generell nicht sagen, dass kommt aber von alleine, wenn du es kannst.


Anmelden zum Antworten