Einfache Zuweisung von boost::shared_ptr



  • Hi!

    Ich hantiere noch nicht so lange mit shared_ptr von boost herum und eine Sachen erscheint mir doch recht umständlich, vielleicht weiß da jemand Abhilfe.
    Da eine Zeile Code mehr sagt als 1000 Worte:

    T functionCall( ... )
    {
        ...
    }
    
    boost::shared_ptr<T> p;
    p = boost::shared_ptr<T>( new T( functionCall( ... ) ) );
    

    Kann man die lange Zeile irgendwie vereinfachen? Als dreckigen Workaround hab ich kurz folgendes gehabt, war mir dann aber doch zu dreckig :D:

    template<class T> void operator+= ( boost::shared_ptr<T>& t, const T& elem )
    {
    	t = boost::shared_ptr<T>( new T( elem ) );
    }
     :arrow_right: 
    p += functionCall( ... );
    

    PS: Kann man eigentlich Zeilennummern für den Code anschalten? Ich meine ich hätte das schon gesehen, aber auch bei den [.code]-Tags gibt's keine Zeilennummern (jedenfalls in der Vorschau).



  • Für sowas hat shared_ptr die Funktion reset.

    p.reset( new T( functionCall( ... ) ) );
    

    Die zeilennummern kommen erst ab einer bestimmten Länge.



  • Braunstein schrieb:

    Für sowas hat shared_ptr die Funktion reset.

    p.reset( new T( functionCall( ... ) ) );
    

    Hm, Mist. Finde ich unbefriedigend, ich finde ein Gleichheitszeichen doch ungleich ausdrucksstärker 😕 Aber danke trotzdem!

    Braunstein schrieb:

    Die zeilennummern kommen erst ab einer bestimmten Länge.

    Oh, ok.



  • Badestrand schrieb:

    boost::shared_ptr<T> p;
    p = boost::shared_ptr<T>( new T( functionCall( ... ) ) );
    

    Kann man auch vereinfachen zu

    boost::shared_ptr<T> p( new T( functionCall( ... ) ) );
    

    Variablen gleich zu initialisieren wenn man sie deklariert wird sowieso meist als besserer Stil angesehn.



  • Achso, klar, aber die Variable sitzt in einer Klasse und wird nicht bei der Konstruktion belegt, deshalb hatte ich das so differenziert hingeschrieben 😉



  • pumuckl! Ja ja, immer diese optimalen Fälle als Lösung.

    Badestrand! Ja, es sieht nicht schön aus und außer Reset gibts erstmal nichts kürzeres.


Anmelden zum Antworten