argumente weiterreichen



  • Hallo,

    wie schreibt man diese Funktion:

    template<class Arg>
    T* f(const Arg& a)
    {
        return new T(a);
    }
    

    Mir gehts um das Argument 'Arg'.
    Schreibe ich es als const-reference, gibts ein Problem falls T eine nicht-const-referenze erwartet.
    zB:

    struct T
    {
        T(char*);
    };
    

    Schreibe ich es ohne const&, dann wird das Objekt uU unnötig kopiert.

    Gibts da eine Lösung für?
    Danke



  • Warum nicht nur per Referenz?



  • Ponto schrieb:

    Warum nicht nur per Referenz?

    f(T(foo,bar));
    

    und co

    🙄



  • Dann macht man es halt fuer beide:

    template<class Arg>
     T* f(Arg & a)
     {
         return new T(a);
     }
    
     template<class Arg>
     T* f(Arg const & a)
     {
         return new T(a);
     }
    


  • Ok das ist auch kein Weg. Bin mir aber nicht sicher.



  • Ponto schrieb:

    Ok das ist auch kein Weg

    nicht? Ich wollte mich gerade bedanken 🙂 Habe nämlich damit rumgespielt und noch keine Konstellation entdeckt, die Probleme macht.
    Oder was übersehe ich da?

    (Überladen hatte ich vorher schonmal ausprobiert, aber immer nur mit Const-Referenz und Nicht-Referenz. Da gabs Mehrdeutigkeiten, im Gegensatz zu deiner Variante)

    // Ah, ok. bist dir nicht sicher. Ich belass es erstmal dabei, sofern keine Einwände kommen.

    Danke



  • DrGreenthumb schrieb:

    Ponto schrieb:

    Ok das ist auch kein Weg

    nicht? Ich wollte mich gerade bedanken 🙂 Habe nämlich damit rumgespielt und noch keine Konstellation entdeckt, die Probleme macht.
    Oder was übersehe ich da?

    (Überladen hatte ich vorher schonmal ausprobiert, aber immer nur mit Const-Referenz und Nicht-Referenz. Da gabs Mehrdeutigkeiten, im Gegensatz zu deiner Variante)

    Ich hab das geschrieben, als mein Test Mehrdeutigkeiten lieferte. Aber die lagen nicht beim Template sondern beim Struct, das ich testete. Deshalb bin ich mir nicht mehr sicher, dass dies kein Weg ist.



  • Ach doch, mein Beispiel was leider falsch. Ich dachte Arg wär gleich T in deinem Beispiel. Aber so sollte das ja gehen, da der Compiler eben im Zweifelsfall Arg als const X nimmt 🙂


Anmelden zum Antworten