„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie können Sie eine "Defer" -Funktion in C ++ implementieren, ohne sich auf STL- oder Boost -Bibliotheken zu verlassen?

Wie können Sie eine "Defer" -Funktion in C ++ implementieren, ohne sich auf STL- oder Boost -Bibliotheken zu verlassen?

Veröffentlicht am 2025-01-27
Durchsuche:570

How can you implement a \

benutzerdefinierte Implementierung einer "Defer" -Funktion in c

In C beinhaltet das Konzept von "Defer" die Ausführung spezifischer Aktionen am Ende durchzuführen eines bestimmten Umfangs oder eines bestimmten Codeblocks. Während die STL (Standard-Vorlagenbibliothek) und die Boost-Bibliotheken keine integrierte Implementierung dieser Funktion bereitstellen, kann eine benutzerdefinierte Lösung mit dem folgenden Code-Snippet erstellt werden:

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer
()) #endif // defer

useage:

Das Auflaufmakro kann in einem bestimmten Bereich verwendet werden, um einen Codeblock zu definieren, der ausgeführt wird, wenn dieses Zielfernrohr endet. Die Syntax lautet wie folgt:
defer {
    // Code to be executed at the end of the current scope
};
Defer { // Code, der am Ende des aktuellen Bereichs ausgeführt werden soll };

Beispiel:

Im folgenden Beispiel wird das Defer -Makro in der Funktion read_entire_file verwendet, um die Eingabedatei automatisch zu schließen, wenn die Funktion beendet:
defer {
    // Code to be executed at the end of the current scope
};
#include #include bool read_entire_file (char *Dateiname, std :: uint8_t *& data_out, std :: size_t *size_out = nullptr) { if (! Dateiname) false zurückgeben; auto file = std :: fopen (Dateiname, "rb"); if (! Datei) false zurückgeben; Defer {std :: fcLose (Datei); }; // muss keine Raii -Datei -Wrapper schreiben. // ... verbleibender Code }

Vorteile:

  • null Overhead:
  • Im Gegensatz zu einigen anderen Implementierungen entspricht dieser Ansatz keinen zusätzlichen Overhead.
  • syntaktisch prägnant:
  • Die Syntax ist so konzipiert, dass sie leicht zu lesen und zu verwenden ist.
  • null Abhängigkeiten:
  • Diese Implementierung stützt sich nicht auf externe Bibliotheken, reduzieren Times kompilieren.
  • flexibel:
  • Der Block auf Verschiebung kann eine gültige C -Anweisung oder einen gültigen Ausdruck enthalten.

Hinweis:

  • Der Name des lokalen Aufstiegsobjekts beginnt mit zz_ anstelle von _, um die Verschmutzung der Namespace zu vermeiden.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3