enable_shared_from_this mit CRTP?



  • Hi,

    kann man enable_shared_from_this mit CRTP "polymorph" machen?

    template<typename connection>
    struct TCPConnection :
        public std::enable_shared_from_this<connection>
    {
        static_assert( std::is_base_of<TCPConnection<connection>, connection>::value, "connection has to be subclass of TCPConnection<connection>!" );
    
        typedef std::shared_ptr<connection> pointer;
    
        static pointer create(boost::asio::io_service& io_service)
        {
            return pointer(new connection(io_service));
        }
    
        /* ......... */
    };
    

    Ich habe das Beispiel hier stark abgeändert, und bin so darauf gekommen.
    Geht das so? Oder geht es auch schöner?

    Es geht darum, dass TCPConnection eine abstrakte Basisklasse ist, von der (eine) Klasse(n) ableitet(n).
    Jetzt soll TCPServer also als Template-Parameter nur connection bekommen, und kann dann damit wie im Beispiel gezeigt, arbeiten.

    MfG



  • Ich hab auch mal was in der Richtung gebraucht und es genauso gelöst:

    http://www.c-plusplus.net/forum/309922-2



  • Sone schrieb:

    Oder geht es auch schöner?

    Das kommt darauf an was man als "schöner" empfindet.
    Wenn die TCPConnection ordentlich gross ist und so richtig viel Code hat, könnte es sich auszahlen sie als einfache Klasse zu implementieren, und erst danach ein Template drüberzulegen.
    Wenn die TCPConnection selbst dabei schon shared_from_this braucht, muss man dann natürlich casten.

    struct TCPConnectionBase :
        public std::enable_shared_from_this<TCPConnectionBase>
    { 
        /* ......... */
    };
    
    template <class connection>
    struct TCPConnection : TCPConnectionBase
    { 
        typedef std::shared_ptr<connection> pointer;
    
        static pointer create(boost::asio::io_service& io_service)
        {
            return pointer(new connection(io_service));
        }
    
        pointer shared_from_this()
        {
            return static_pointer_cast<connection>(TCPConnectionBase::shared_from_this());
        }
    
    };
    


  • Wenn die TCPConnection ordentlich gross ist und so richtig viel Code hat, könnte es sich auszahlen sie als einfache Klasse zu implementieren, und erst danach ein Template drüberzulegen.

    Lol nein, das ... Kommentar ersetzt praktisch fast nichts. ^^


Anmelden zum Antworten