Berikut adalah beberapa tajuk bahasa Inggeris yang sepadan dengan kandungan artikel: Tajuk ringkas (pendek dan langsung): * Bagaimana untuk Membina ScopeGuard Mudah dengan C 11 Idiom? * Melaksanakan ScopeGuard Mudah dalam C 11: Pendekatan Praktikal * C 11 ScopeGuard: A Ringkas dan Praktikal I

Linda Hamilton
Lepaskan: 2024-10-26 10:12:03
asal
1005 orang telah melayarinya

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

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

* 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

SkopGuard yang ringkas dan praktikal dalam C 11

Soalan:

Cara menggunakan simpulan bahasa C 11 untuk menulis berdasarkan Alexandrescu konsep Simple ScopeGuard?

Jawapan:

Berikut ialah pelaksanaan ScopeGuard berdasarkan simpulan bahasa C 11:

<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>
Salin selepas log masuk

Penggunaan:

<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>
Salin selepas log masuk

Kelebihan:

  • Mudah dan mudah digunakan
  • Kod ringkas
  • Menyokong pengendalian pengecualian

Isu berpotensi:

  • Jika fungsi advise lambda membuang pengecualian, fungsi lambda keluaran tidak akan dipanggil kerana ia tidak pernah membina ScopeGuard sepenuhnya.
  • Jika fungsi pembersihan membuang pengecualian, atur cara akan ditamatkan secara tidak dijangka.

Atas ialah kandungan terperinci Berikut adalah beberapa tajuk bahasa Inggeris yang sepadan dengan kandungan artikel: Tajuk ringkas (pendek dan langsung): * Bagaimana untuk Membina ScopeGuard Mudah dengan C 11 Idiom? * Melaksanakan ScopeGuard Mudah dalam C 11: Pendekatan Praktikal * C 11 ScopeGuard: A Ringkas dan Praktikal I. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan