Makro oder Template



  • Hallo,

    mich interessiert, was eine bessere Lösung für das Finden vom Maximum von zwei Zahlen ist:

    Lösung a:

    template
    <
        unsigned int A,
        unsigned int B
    >
    struct max_helper
    {
    		static const unsigned value = (A > B) ? A : B;
    };
    

    Lösung b:

    #define MAX(a, b) (((a) > (b)) ? (a) : (b))
    

    Meine Vermutung ist, dass a besser ist, aber nur genutzt werden kann, wenn der Datentyp bekannt ist. Ein weiterer Vorteil wäre, dass Namensräume zur Verfügung stehen, was bei Makros nicht ist.

    Liege ich damit richtig?

    Viele Grüße
    MM



  • Brauchst du ein Compilezeit-Maximum?

    Sonst gibts noch std::max() . Wenn du allerdings zwei verschiedene Typen übergibst, musst du angeben, als welchen Typ die Parameter betrachtet werden sollen.



  • MrMilk schrieb:

    Hallo,

    mich interessiert, was eine bessere Lösung für das Finden vom Maximum von zwei Zahlen ist:

    Lösung a:

    template
    <
        unsigned int A,
        unsigned int B
    >
    struct max_helper
    {
    		static const unsigned value = (A > B) ? A : B;
    };
    

    würde ich etwas anders angehen:

    template <unsigned int N>
    struct IntType { static const unsigned int value = N; };
    
    template <class A, class B>
    struct Max
    {
      static const unsigned int value = A::value > B::value? A::value : B::value;
      typedef IntType<value> type;
    };
    

    Macht es besser zu verwenden mit anderen Template-Metaprogramming tools wie z.B. denen aus boost.



  • pumuckl schrieb:

    Macht es besser zu verwenden mit anderen Template-Metaprogramming tools wie z.B. denen aus boost.

    Das interessiert mich jetzt. Ich kenne mich mit Boost.MTL nicht aus, gibt es da bestimmte Anforderungen?

    Übrigens würde dich ein C-Programmierer für deinen Code definitiv steinigen. 😃



  • Nexus schrieb:

    Übrigens würde dich ein C-Programmierer für deinen Code definitiv steinigen.

    So weit ich weiß töten die C-Programmierer am liebsten, indem sie einen mit Spaghetti-Code erwürgen.



  • Nexus schrieb:

    Brauchst du ein Compilezeit-Maximum?

    Sonst gibts noch std::max() . Wenn du allerdings zwei verschiedene Typen übergibst, musst du angeben, als welchen Typ die Parameter betrachtet werden sollen.

    Jep, Berechnungen sollen zur Compilezeit durchgeführt werden.



  • Nexus schrieb:

    pumuckl schrieb:

    Macht es besser zu verwenden mit anderen Template-Metaprogramming tools wie z.B. denen aus boost.

    Das interessiert mich jetzt. Ich kenne mich mit Boost.MTL nicht aus, gibt es da bestimmte Anforderungen?

    IIRC gibts da vor allem die Anforderung dass die einzelnen Metafunktionen immer ein typedef type haben, das den Rückgabewert der Funktion darstellt. Zahlenwerte, Wahrheitswerte usw. werden in eigenen Typen gewrappt. (es gibt einen extra für ints sw, den man an Stelle von IntType hier benutzen sollte, ich habs nur grad nicht zur Hand)

    Übrigens würde dich ein C-Programmierer für deinen Code definitiv steinigen. :D[/quote]



  • pumuckl schrieb:

    IIRC gibts da vor allem die Anforderung dass die einzelnen Metafunktionen immer ein typedef type haben, das den Rückgabewert der Funktion darstellt. Zahlenwerte, Wahrheitswerte usw. werden in eigenen Typen gewrappt. (es gibt einen extra für ints sw, den man an Stelle von IntType hier benutzen sollte, ich habs nur grad nicht zur Hand)

    Danke für die Erklärung, das scheint Sinn zu machen. Aber eigentlich resultiert das ja nur aus der Tatsache, dass es im momentanen Standard kein decltype gibt. Trotzdem kann es natürlich praktisch sein, immer gleich ein entsprechendes typedef zu haben, wenn vielleicht mehr als nur der rohe Typ bekannt sein soll...


Anmelden zum Antworten