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


 Allerdings müsste dadurch die Implementierung der Template-Klasse komplett in den Header rutschen - Die Implementierung von Methoden von Template-Klassen ist afaik nur in Headern möglich. Das würde die ganze Sache imho abartig hässlich zu lesen und zu erweitern machen.
 Allerdings müsste dadurch die Implementierung der Template-Klasse komplett in den Header rutschen - Die Implementierung von Methoden von Template-Klassen ist afaik nur in Headern möglich. Das würde die ganze Sache imho abartig hässlich zu lesen und zu erweitern machen.