Problem mit Templates, was sonst?



  • Hi,

    ich habe folgende Funktion:

    // Gibt kleinste Zahl von 'a' und 'b' zurück.
    template <class T> __forceinline const T foobar (const T& a, const T& b)
    {
        // Tu etwas
    }
    

    die funktioniert für jeden typen, doch für den Datentyp float soll ne andere Funktion aufgerufen werden die Speziell auf Float abgestimmt ist! heißt aber auch foobar.!

    Also für Float die eine Spezielle Funktion und für alles andere das Template, wie mach ich das?





  • --- schrieb:

    Also für Float die eine Spezielle Funktion und für alles andere das Template, wie mach ich das?

    Im Gegensatz zu meinem Vorredner würde ich hier keinesfalls zur Spezialisierung raten. Vielmehr ist eine einfache Überladung hier das Mittel der Wahl:

    // für alle T...
    template <class T> const T foobar (const T& a, const T& b)
    {
        // Tu etwas
    } 
    
    // ...für T = float
    inline float foobar(float a, float b)
    {
        // Tu was anderes
    }
    


  • Und verzichte bitte auf __forceinline, und nimm das vom Standard vorgesehene Schlüsselwort inline.



  • __forceinline dient dazu dem Compiler zu sagen, dass die Funktion expandiert werden soll. inline tut das nicht. AFAIK sind template-Funktionen von sich aus bereits inline.



  • Wo wäre denn der Sinn wenn templatefunktionen grundsätzlich immer inline wären?
    Ich sehe ihn nicht, es gibt doch auch sehr große templatefunktionen wo sich inline dann negativ bemerkbar machen würde?



  • Helium schrieb:

    AFAIK sind template-Funktionen von sich aus bereits inline.

    Da irrst du. Template-Funktionen haben wie inline-Funktionen die selbe "once per translation unit"-Eigenschaft. Sie sind aber nicht automatisch inline.
    Wenn du eine inline-Funktion haben willst, musst du auch bei Templates explizit inline hinschreiben.



  • Template-Funktionen haben wie inline-Funktionen die selbe "once per translation unit"-Eigenschaft. Sie sind aber nicht automatisch inline.

    Und was ist der Unterschied? Das bei inline die Wahrscheinlich keit der Code-Expansion größer ist?
    Wenn ich wirklich will, das eine Funktion expandiert wird, würde ich glaube ich nicht-konforme Dinge, wie __forceinline verwenden (falls der compiler sie unterstützt).
    Oder gibts da noch was, dessen ich mir gerade nicht bewusst bin?


Anmelden zum Antworten