c ++ # ein Makro mit Klammern definieren?

8

Anstatt jedes Mal folgendes zu tun

%Vor%

Ich möchte eine Art Makro definieren, das es ermöglicht, wie folgt zu schreiben:

%Vor%

Ist es in C ++ möglich?

    
Rolle 17.04.2009, 08:44
quelle

9 Antworten

40

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.

    
Greg Hewgill 17.04.2009, 08:49
quelle
14

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.

    
avakar 17.04.2009 08:49
quelle
6

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.

    
Iraimbilanja 17.04.2009 09:29
quelle
4
%Vor%     
dirkgently 17.04.2009 08:49
quelle
2

Generische Lösung mit RAII und boost :: function (std :: function).

%Vor%

oder um die Idee zu testen und zu überprüfen

%Vor%     
Mykola Golubyev 17.04.2009 08:59
quelle
1

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 .

    
Pontus Gagge 17.04.2009 08:49
quelle
1

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

    
Naveen 17.04.2009 08:50
quelle
1

Gutschrift für die Idee .. Ich dachte, ich würde den Rest in

füllen

#define startstop() for(start();isStarted();stop())

    
user103391 26.07.2010 17:31
quelle
0

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.

    
Jason Coyne 18.04.2009 16:15
quelle

Tags und Links