ホームページ  >  記事  >  バックエンド開発  >  以下に、記事の内容と一致する英語のタイトルをいくつか示します。 簡潔なタイトル (短く直接的): * C 11 のイディオムを使用して簡単な ScopeGuard を構築するには? * C 11 での単純な ScopeGuard の実装: 実践的なアプローチ * C 11 スコープガード: 簡潔で実践的な I

以下に、記事の内容と一致する英語のタイトルをいくつか示します。 簡潔なタイトル (短く直接的): * C 11 のイディオムを使用して簡単な ScopeGuard を構築するには? * C 11 での単純な ScopeGuard の実装: 実践的なアプローチ * C 11 スコープガード: 簡潔で実践的な I

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 10:12:031007ブラウズ

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

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

* 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

C 11 の簡潔で実践的な ScopeGuard

質問:

Alexandrescu に基づいて C 11 のイディオムを使用して記述する方法コンセプト シンプルスコープガード?

回答:

以下は、C 11 イディオムに基づく ScopeGuard 実装です:

<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>

使用法:

<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>

利点:

  • シンプルで使いやすい
  • 簡潔なコード
  • 例外処理をサポート

潜在的な問題:

  • アドバイス ラムダ関数が例外をスローした場合、リリース ラムダ関数は ScopeGuard を完全に構築しないため呼び出されません。
  • クリーンアップ関数が例外をスローした場合、プログラムは予期せず終了します。

以上が以下に、記事の内容と一致する英語のタイトルをいくつか示します。 簡潔なタイトル (短く直接的): * C 11 のイディオムを使用して簡単な ScopeGuard を構築するには? * C 11 での単純な ScopeGuard の実装: 実践的なアプローチ * C 11 スコープガード: 簡潔で実践的な Iの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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