Sie können etwas sehr schließen, indem Sie eine kleine C ++ - Hilfsklasse verwenden.
%Vor%Dann in Ihrem Code:
%Vor% Wenn die Ausführung in den Block eintritt und die Variable ss
erstellt, wird die Funktion start()
aufgerufen. Wenn die Ausführung den Block verlässt, wird der StartStopper
Destruktor automatisch aufgerufen und ruft dann stop()
auf.
Die idiomatische Methode, dies in C ++ zu tun, heißt Initialisierung der Ressourcenerfassung oder kurz RAII. Zusätzlich zu dem, was Sie möchten, bietet es auch den zusätzlichen Vorteil, dass es ausnahmesicher ist: Die Funktion stop
wird aufgerufen, auch wenn Ihr Code eine Ausnahme auslöst.
Definieren Sie eine Guard-Struktur:
%Vor%und schreiben Sie Ihren Code so um:
%Vor% Der Destruktor des Wächters (und damit die Funktion stop
) wird automatisch am Ende des umschließenden Blocks aufgerufen.
Andere Antworten haben die RAII-Seite der Frage gut angesprochen, also Ich werde die Syntaxseite davon ansprechen .
%Vor%Verwendet wie :
%Vor%Sollte selbsterklärend genug sein.
Generische Lösung mit RAII und boost :: function (std :: function).
%Vor%oder um die Idee zu testen und zu überprüfen
%Vor%Was versuchst du zu tun? Ich würde empfehlen, RAII als viel mehr C ++ - orientierte Vorgehensweise zu betrachten, als Makro-Hacking mit all seinen unvorhergesehenen Konsequenzen .
Verwenden Sie keine Makros. Sie können stattdessen Inline-Funktionen verwenden, da sie Typprüfungen und andere Funktionen zur Verfügung stellen. Sie können hier nachsehen: Inline-Funktionen
Gutschrift für die Idee .. Ich dachte, ich würde den Rest in
füllen #define startstop() for(start();isStarted();stop())
In c # könnten Sie das IDisposable-Muster verwenden und Ihre Stop () - Funktion in der Dispose () -Methode implementieren, aber das würde funktionieren, wenn Sie eine .net-Variante von c ++ verwenden würden.