ホームページ  >  記事  >  バックエンド開発  >  C 11 ラムダ式を使用してスコープ ガードを実装するにはどうすればよいですか?

C 11 ラムダ式を使用してスコープ ガードを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 13:20:02306ブラウズ

How can C  11 Lambda Expressions be Used to Implement Scope Guards?

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&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; }
};</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&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>

この例では、ScopeGuard を使用して、要素がベクトルから削除されるようにします。例外が発生します。

結論

スコープ ガードは、C 11 でリソースが適切に解放されることを保証するための強力なツールです。ここで紹介する単純な実装は、簡単に実装する方法です。このパターン。ただし、スコープ ガード間でリソースの所有権を転送する機能などの追加機能を提供する、より複雑な実装もあります。

以上がC 11 ラムダ式を使用してスコープ ガードを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。