std::auto_ptr mit typedef "umbenennen"



  • Nun ja, Template typedefs kommen erst mit C++11, das sieht dann so aus:

    template <int N>
    using ISmartPointer = std::auto_ptr<T>;
    

    Allerdings wird das von VS noch nicht unterstützt, was nicht gerade toll ist. Wo wir gerade dabei sind, das könnte für dich interessant sein: http://www.gotw.ca/gotw/079.htm
    Und auto_ptr ist zu recht deprecated und sollte nicht verwendet werden. Stattdessen nimm lieber unique_ptr oder shared_ptr, die bringt wohl fast jeder aktuelle Compiler mit.



  • Also mit VS2008 funktionier #define ISmartPointer auto_ptr wunderbar.Jedoch gibt es da noch keine unique/shared_ptr.Gibt es für VS2008 irgendwas anderes ??? Es geht mir nur darum, dass Instanzen von Klassen später freigegeben werden, sonst nichts



  • Ich würde ihn ja in DeprecatedDumbPointer umbenenennen.



  • 🙂



  • scoped_ptr und shared_ptr aus Boost.

    Und sonst halt schnell eine Klasse schreiben, die im Destruktor delete aufruft und privaten, nicht implementierten Kopierkonstruktor und Zuweisungsoperator hat. Evtl. noch vor dem Löschen vollständigen Typen mit sizeof sicherstellen.



  • WTF ich mach jetzt folgendes:

    ISmartPointer<IGameManager*> _gameManager(new IGameManager());

    Wie kann ich jetzt methoden der Instanz _gameManager aufrufen ???
    _gameManager->...fail
    _gameManager.get()->...fail

    ???



  • Ohh man es ist schon zu spät.Der Stern muss natürlich weg, da es ja schon als Pointer deklariert wird.....



  • Eine aktuelle Version von VS kannst/darfst du nicht nutzen? Würde sich irgendwie anbieten.



  • Ne kann ich gerade nicht, da ich ein paar libs brauche ,die bissher nur auf VS2008 compiliert wurden.



  • Wäre das Portieren der Libs auf VS10 so aufwändig?



  • Template Alias (C++11) Ersatz für C++03

    #include <memory>
    
    template <typename T>
    struct s
    {
      typedef std::auto_ptr<T> smart_pointer;
    };
    
    int main()
    {
      s<int>::smart_pointer ptr(new int(3));
    }
    

    Dass besser die Smart Pointer von Boost verwendet werden sollen wurde ja schon erwähnt. Hier nur der allgemeine Ersatz für die C++11 Template Alias.



  • Man kann auch sowas Ähnliches auch durch Ableiten bekommen:

    template< class T >
    class my_ptr
      : public std::auto_ptr< T >
    {
    public:
        template< class... Args >
        my_ptr( Args&&... args )
          : std::auto_ptr< T >( std::forward< Args >( args )... )
        {}
        //das gleiche noch für assignment
    };
    


  • GorbGorb schrieb:

    [...]

    C++03 ?



  • Swordfish schrieb:

    GorbGorb schrieb:

    [...]

    C++03 ?

    Falls variadic templates verfügbar sind, template typedefs aber nicht, ist das eine Lösung. Ansonsten funktioniert es wahrscheinlich auch so passabel (oder man macht noch mal ne Funktion für 2 Parameter rein), bis c++11 verfübar ist:

    template< class T >
    class my_ptr
      : public std::auto_ptr< T >
    {
    public:
        template< class Arg >
        my_ptr( const Arg& arg )
          : std::auto_ptr< T >( arg )
        {}
        template< class Arg >
        my_ptr( Arg& arg )
          : std::auto_ptr< T >( arg )
        {}
        //das gleiche noch für assignment
    };
    


  • theta schrieb:

    Template Alias (C++11) Ersatz für C++03

    #include <memory>
    
    template <typename T>
    struct s
    {
      typedef std::auto_ptr<T> smart_pointer;
    };
    
    int main()
    {
      s<int>::smart_pointer ptr(new int(3));
    }
    

    Dass besser die Smart Pointer von Boost verwendet werden sollen wurde ja schon erwähnt. Hier nur der allgemeine Ersatz für die C++11 Template Alias.

    Jetzt noch das typename davorschreiben.
    Furchtbar das der MSVC das durchgehen lässt, aber Microsoft lässt es ja selbst bei Codesamples weg ...



  • Ethon schrieb:

    Jetzt noch das typename davorschreiben.
    Furchtbar das der MSVC das durchgehen lässt, aber Microsoft lässt es ja selbst bei Codesamples weg ...

    Furchtbar wäre, wenn sie es nicht durchliessen. Hier brauchts nämlich kein typename .



  • Nexus schrieb:

    Ethon schrieb:

    Jetzt noch das typename davorschreiben.
    Furchtbar das der MSVC das durchgehen lässt, aber Microsoft lässt es ja selbst bei Codesamples weg ...

    Furchtbar wäre, wenn sie es nicht durchliessen. Hier brauchts nämlich kein typename .

    👍 🕶


Anmelden zum Antworten