enable_shared_from_this mit CRTP?
-
Hi,
kann man
enable_shared_from_thismit 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
TCPConnectioneine 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:
-
Sone schrieb:
Oder geht es auch schöner?
Das kommt darauf an was man als "schöner" empfindet.
Wenn dieTCPConnectionordentlich 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 dieTCPConnectionselbst dabei schonshared_from_thisbraucht, 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. ^^