Code: Alles auswählen
#include <iostream>
#include <map>
typedef int CommandID;
class Base;
typedef void (Base::*CallbackPtr)(const std::string& data);
class Base {
protected:
std::map<CommandID, CallbackPtr> callbacks;
public:
void trigger(CommandID id, const std::string& data) {
auto entry = this->callbacks.find(id);
if (entry == this->callbacks.end()) {
std::cout << "Undefined callback for #" << id << std::endl;
} else {
CallbackPtr callback = entry->second;
(this->*callback)(data);
}
}
};
// ----------------------------------------------------------------------------
CommandID FOO = 1;
CommandID BAR = 2;
class Derived: public Base {
protected:
void foo(const std::string& data) {
std::cout << "foo: " << data << std::endl;
}
void bar(const std::string& data) {
std::cout << "bar: " << data << std::endl;
}
public:
Derived(): Base() {
this->callbacks[FOO] = (CallbackPtr)(&Derived::foo);
this->callbacks[BAR] = (CallbackPtr)(&Derived::bar);
}
};
// ----------------------------------------------------------------------------
int main() {
Derived d;
d.trigger(FOO, "test");
d.trigger(BAR, "1337");
}
Zum Hintergrund: In meinem Framework werden JSON-Objekte serialisiert, versandt und deserialisiert. Um den Objekten Callback-Methoden zuzuweisen, will ich IDs verwenden und quasi die Callback-Methode, die zur CommandID hinterlegt wurde, mit den übrigen JSON-Daten aufzurufen.
Auf was ich hinaus möchte: Kann ich das ganze noch weiter "verschönern", oder bin ich da (ohne ausgefallene OOP-Design Pattern) am Ende der (einfachen) Fahnenstange?
LG Glocke