Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Alter Hase
Zitat
It doesn't work and I don't know why.
It does work and I don't know why.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
//... using EventPtr = void*; using InstancePtr = void*; //... template<typename TEvent, class TClass, void(TClass::*TCallback)(TEvent*)> static inline void MethodCallback(InstancePtr instance, EventPtr event){ (static_cast<TClass*>(instance)->*TCallback)(static_cast<TEvent*>(event)); } |
C-/C++-Quelltext |
|
1 2 |
using CallbackPtr = void(*)(InstancePtr, EventPtr); using Callback = std::pair<InstancePtr, CallbackPtr>; |
C-/C++-Quelltext |
|
1 2 3 4 |
using CallbackList = std::vector<Callback>; using UUID = uint32_t; using Connections = std::map<uint32_t, CallbackList>; Connections connections; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
template<struct TEvent, class TClass, void(TClass::*TCallback)(TEvent*)> void bind(TClass* instance){ uint32_t uuid{TEvent::uuid()}; connections[uuid].emplace_back(nullptr,// Eigentlich sollte hier [b]instance[/b] stehen. &MethodCallback<TEvent, TClass, TCallback>); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
template<typename TEvent> void emit(TEvent* event){ for(auto cb : connections[TEvent::uuid()]) cb.second(cb.first, event); // <- Hier nullptr exception erwartet. // Vergleich mit vorherigen Codebeispiel // std::pair.first -> Pointer zur Instanz der Klasse // std::pair.second -> Pointer zur Methode } |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Julién« (30.08.2016, 01:00)
Administrator
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Java-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
package main; public class Main { public static class ServerConnection { void sendRegistartionAborted() { System.out.println("RegistrationAborted - sent"); } void sendCrashed(int playerID) { System.out.println("Crashed(" + new Integer(playerID) + ") - sent"); } void sendKicked(int playerID, String msg) { System.out.println("Kicked(" + new Integer(playerID) + ", \"" + msg + "\") - sent"); } } public interface Event { public void send(ServerConnection con); } enum Events implements Event { RegistrationAborted { @Override public void init() { System.out.println("RegistrationAborted - Init"); } @Override public void send(ServerConnection con) { con.sendRegistartionAborted(); } }, Crashed { private int i; @Override public void init(int i) { System.out.println("Crashed - Init"); this.i = i; } @Override public void send(ServerConnection con) { con.sendCrashed(this.i); } }, Kicked { private int i; private String msg; @Override public void init(int i, String msg) { System.out.println("Kicked - Init"); this.i = i; this.msg = msg; } @Override public void send(ServerConnection con) { con.sendKicked(this.i, this.msg); } }; public void init() { throw new IllegalArgumentException("Undefined for this enum value"); } public void init(int val) { throw new IllegalArgumentException("Undefined for this enum value"); } public void init(int val, String msg) { throw new IllegalArgumentException("Undefined for this enum value"); } } public static void main(String[] args) { ServerConnection sv = new ServerConnection(); Events.Crashed.init(100); Events.Crashed.send(sv); Events.Kicked.init(123, "Being dumb"); Events.Kicked.send(sv); Events.RegistrationAborted.init(); Events.RegistrationAborted.send(sv); System.out.println(); Events ev = Events.Crashed; ev.init(556); Events.Crashed.send(sv); } } |
C-/C++-Quelltext |
|
1 |
std::vector<std::vector<std::vector<std::vector<char>>>> |
Werbeanzeige