C 11 のスコープ ガード
C 11 ラムダ式の主な利点の 1 つは、RAII の概念を表現できることです (リソースの取得は初期化です)を、簡潔かつエレガントな方法で説明します。 RAII の従来の実装はリソースを解放するためにデストラクターに依存していますが、ラムダ式を使用すると、スコープからの終了がどのように発生したかに関係なく、スコープからの終了時にクリーンアップ関数を実行するオブジェクトを作成できます。これはスコープ ガードとして知られています。
単純なスコープ ガードの実装
C 11 での単純なスコープ ガード実装の例を次に示します。
<code class="c++">template< typename Lambda > class ScopeGuard { mutable bool committed; Lambda rollbackLambda; public: ScopeGuard( const Lambda& _l) : committed(false) , rollbackLambda(_l) {} template< typename AdquireLambda > ScopeGuard( const AdquireLambda& _al , const Lambda& _l) : committed(false) , rollbackLambda(_l) { _al(); } ~ScopeGuard() { if (!committed) rollbackLambda(); } inline void commit() const { committed = true; } };</code>
ScopeGuard クラスは、コンストラクター引数としてラムダ式を受け取ります。これは、スコープ ガードがスコープ外に出たときに実行されるクリーンアップ アクションを表します。コミットされたフラグは、クリーンアップ アクションが実行されたかどうかを示します。
使用法
ScopeGuard クラスを使用すると、例外が発生した場合でもリソースが適切に解放されるようにすることができます。 。たとえば、次の関数はリソースを取得し、スコープ ガードを使用してリソースが確実に解放されるようにします。
<code class="c++">void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions() { std::vector<int> myVec; std::vector<int> someOtherVec; myVec.push_back(5); //first constructor, adquire happens elsewhere const auto& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } ); //sintactically neater, since everything happens in a single line const auto& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); } , [&]() { someOtherVec.pop_back(); } ); b.commit(); a.commit(); }</code>
この例では、ScopeGuard を使用して、要素がベクトルから削除されるようにします。例外が発生します。
結論
スコープ ガードは、C 11 でリソースが適切に解放されることを保証するための強力なツールです。ここで紹介する単純な実装は、簡単に実装する方法です。このパターン。ただし、スコープ ガード間でリソースの所有権を転送する機能などの追加機能を提供する、より複雑な実装もあります。
以上がC 11 ラムダ式を使用してスコープ ガードを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。