std::function und std::bind durch einfachere eigene Variante ersetzen (signal/slot)
-
FlashBurn schrieb:
Ich muss zugeben das ich nicht viel von dem Code verstehe, insbesondere nicht wozu man den braucht.
Ich habe doch deutlich geschrieben, dass diese Implementierung den Overhead durch
new
vermeidet indem sie alle Objekte imFunction
Objekt konstruiert.Allerdings läuft der finale Code auf einem Embedded System und daher möchte/muss ich auf new verzichten und das ist bei std::bind ja nicht sicher gestellt.
Für mich ist er außerdem nicht nutzbar, da ein dynamic_cast benutzt wird und der eine Exception werfen kann, welche auf meinem Embedded System auch nicht zur Verfügung stehen.
dynamic_cast
hat ausschließlich das Potenzial zu werfen, wenn man zu einem Referenztyp konvertiert. Das ist hier nicht der Fall. 2.dynamic_cast
ist nicht für das Aufrufen des targets nötig, du kannst dieses Feature auch komplett weglassen wenn du möchtest.
-
Hi!
Ich habe mich auch mal dran versucht und damit den GCC 7.2 zum Absturz gebracht. Aber Clang 5 hat's geschafft. Es geht in Richtung "fast delegates", aber implementiert mit den neuen auto-Template-Parameter.
Nachteile:
- Unterstützt nur freie Funktionen und Objektmethoden
Vorteile:
- Kein
new
- Sehr klein (immer zwei Zeiger groß)
- Der Compiler kann das gut optimieren
Der Beispiel-Code sieht so aus:
// Magische Definition von function<> und fun<> hier. #include <iostream> static void hello() { std::cout << "Hello!\n"; } struct strukt { int member; void increment() { member += 1; } void show() const { std::cout << member << '\n'; } }; int main() { strukt s = { 42 }; function<void()> f = fun<&hello>(); f(); f = fun<&strukt::increment>(&s); f(); f(); f(); f = fun<&strukt::show>(&s); f(); return 0; }
Hier ist der komplette Code. Das bekommt der Compiler auch krass optimiert: Es wird alles ge-inline-t.
-
FlashBurn schrieb:
@Meep Meep
Wenn ich deinen Code nicht vollständig falsch verstanden habe, dann kann er aber nur einen Empfänger benachrichtigen!?
nunja, in dem fall hat er bzw. ist es ein slot.
du kannst ja ueber eine registrierungsfunktion mehrere signalobjekte in einen vector oder sonst wo reinstopfen. wenn dann das bestimmte event auftritt, dann gehst du einfach die liste durch und rufst alle auf.
-
@Columbo Ich bin zufällig über Deinen Code gestolpert. Sowas hatte ich schon länger für Anwendungen in kleinen Microcontrollern gesucht. Ich habe, nach einigen Anpassungen für c++11 toolchains, daraus eine kleine Arduino "Library" gemacht und würde die gerne auf gitHub stellen (Draft hier: https://github.com/luni64/staticFunctional) wenn Du nichts dagegen hast.
Lizenz: MIT
Ich würde dich als Author natürlich erwähnen.Passt das für Dich?
-
@luni64 Einverstanden.