Heim > Backend-Entwicklung > C++ > Hauptteil

Im Folgenden finden Sie mehrere englische Titel, die zum Inhalt des Artikels passen: Prägnanter Titel (kurz und direkt): * Wie erstellt man einen einfachen ScopeGuard mit C 11-Redewendungen? * Implementierung eines einfachen ScopeGuard in C 11: Ein praktischer Ansatz * C 11 ScopeGuard: Ein prägnantes und praktisches I

Linda Hamilton
Freigeben: 2024-10-26 10:12:03
Original
1006 Leute haben es durchsucht

以下是几个符合文章内容的英文标题:

简洁的标题(简短且直接):

* How to Build a Simple ScopeGuard with C  11 Idioms? 
* Implementing a Simple ScopeGuard in C  11: A Practical Approach
* C  11 ScopeGuard: A Concise and Practical Implementation

更详细的标题(阐明文章重点):

* C  11 ScopeGuard: A S

Prägnanter und praktischer ScopeGuard in C 11

Frage:

Wie man C 11-Redewendungen zum Schreiben basierend auf Alexandrescu verwendet Konzept Einfacher ScopeGuard?

Antwort:

Das Folgende ist eine ScopeGuard-Implementierung basierend auf dem C 11-Idiom:

<code class="cpp">namespace RAII
{
    template< typename Lambda >
    class ScopeGuard
    {
        mutable bool committed;
        Lambda rollbackLambda; 
        public:

            ScopeGuard( const Lambda&amp; _l) : committed(false) , rollbackLambda(_l) {}

            template< typename AdquireLambda >
            ScopeGuard( const AdquireLambda&amp; _al , const Lambda&amp; _l) : committed(false) , rollbackLambda(_l)
            {
                _al();
            }

            ~ScopeGuard()
            {
                if (!committed)
                    rollbackLambda();
            }
            inline void commit() const { committed = true; }
    };

    template< typename aLambda , typename rLambda>
    const ScopeGuard< rLambda >&amp; makeScopeGuard( const aLambda&amp; _a , const rLambda&amp; _r)
    {
        return ScopeGuard< rLambda >( _a , _r );
    }

    template<typename rLambda>
    const ScopeGuard< rLambda >&amp; makeScopeGuard(const rLambda&amp; _r)
    {
        return ScopeGuard< rLambda >(_r );
    }
}</code>
Nach dem Login kopieren

Verwendung:

<code class="cpp">void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions() 
{
   std::vector<int> myVec;
   std::vector<int> someOtherVec;

   myVec.push_back(5);
   //first constructor, adquire happens elsewhere
   const auto&amp; a = RAII::makeScopeGuard( [&amp;]() { myVec.pop_back(); } );  

   //sintactically neater, since everything happens in a single line
   const auto&amp; b = RAII::makeScopeGuard( [&amp;]() { someOtherVec.push_back(42); }
                     , [&amp;]() { someOtherVec.pop_back(); } ); 

   b.commit();
   a.commit();
}</code>
Nach dem Login kopieren

Vorteile:

  • Einfach und benutzerfreundlich
  • Prägnanter Code
  • Unterstützt die Ausnahmebehandlung

Potenzielle Probleme:

  • Wenn die Advise-Lambda-Funktion eine Ausnahme auslöst, wird die Release-Lambda-Funktion nie aufgerufen, da sie den ScopeGuard nie vollständig erstellt.
  • Wenn die Bereinigungsfunktion eine Ausnahme auslöst, wird das Programm unerwartet beendet.

Das obige ist der detaillierte Inhalt vonIm Folgenden finden Sie mehrere englische Titel, die zum Inhalt des Artikels passen: Prägnanter Titel (kurz und direkt): * Wie erstellt man einen einfachen ScopeGuard mit C 11-Redewendungen? * Implementierung eines einfachen ScopeGuard in C 11: Ein praktischer Ansatz * C 11 ScopeGuard: Ein prägnantes und praktisches I. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage