Tutorials - Templatisierte Listener - oder: fucking call it!

Sprachenübersicht/Programmierung/C / C++/ C#/Metaprogrammierung

Templatisierte Listener - oder: fucking call it!

Diese Seite wurde 2277 mal aufgerufen.

Dieser Artikel wurde in einem Wikiweb System geschrieben, das heißt, Sie können die Artikel jederzeit editieren, wenn Sie einen Fehler gefunden haben, oder etwas hinzufügen wollen.

Editieren Versionen Linkpartnerschaft Bottom Printversion

Keywords: template listener, C++

Das Problem: Top



Vor allem im Netzwerkbereich wären Listener praktisch, die per Template ihre parameter ändern können:

Code:


template<class T> struct PacketListener 

   virtual void processPacket( T* packet ); 
}    



Alles schön und gut, doch lassen sich diese Listener nicht verwenden, wenn man sie als PacketListener* in einer map, einem array oder sonstwas speichert. Die processPacket funktion lässt sich aus gutem Grund nicht aufrufen.

Lösung: Top


Hazel und ich haben dann zusmamen folgende Lösung gebastelt:

Code:


template<class T> class NetworkListenerBase 

public: 
   virtual void onPacket( T* packet ) = 0; 
}; 

class NetworkListenerHelper 

public: 
   virtual void callListener( Packet* p ) = 0; 
}; 

template<class T> class NetworkListener: public NetworkListenerBase<T>, public NetworkListenerHelper 

   void callListener( Packet* p ) 
   { 
      this->onPacket( (T*) p->data ); 
   } 
};    



So lassen sich zeiger auf NetworkListenerHelper speichern und aufrufen.

Ein Beispiel:

Code:


class NetworkManager 

private: 
   std::map<unsigned int, NetworkListenerHelper*> listener; 

public: 
   template<class T> void addListener( T* listener ) 
   { 
      this->listener[T::packetId] = static_cast<NetworkListenerHelper*> listener; 
   } 

   void dispatchPacket( const unsigned char& id, Packet* packet ) 
   { 
      if( listener.find(id) != listener.end() ) 
      { 
         listener[id]->callListener( packet ); 
      } 
   } 
};    



Kritik erwünscht!

hazel und xardias

Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren?

Editieren Versionen Linkpartnerschaft Top Printversion

Haben Sie einen Fehler gefunden? Dann klicken Sie doch auf Editieren, und beheben den Fehler, keine Angst, Sie können nichts zerstören, das Tutorial kann wiederhergestellt werden

Sprachenübersicht/Programmierung/C / C++/ C#/Metaprogrammierung/Templatisierte Listener - oder: fucking call it!