質問:
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& _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; } }; template< typename aLambda , typename rLambda> const ScopeGuard< rLambda >& makeScopeGuard( const aLambda& _a , const rLambda& _r) { return ScopeGuard< rLambda >( _a , _r ); } template<typename rLambda> const ScopeGuard< rLambda >& makeScopeGuard(const rLambda& _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& 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>
利点:
潜在的な問題:
以上が以下に、記事の内容と一致する英語のタイトルをいくつか示します。 簡潔なタイトル (短く直接的): * C 11 のイディオムを使用して簡単な ScopeGuard を構築するには? * C 11 での単純な ScopeGuard の実装: 実践的なアプローチ * C 11 スコープガード: 簡潔で実践的な Iの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。