Bagaimanakah C 11 Lambda Expressions boleh Digunakan untuk Melaksanakan Pengawal Skop?

Susan Sarandon
Lepaskan: 2024-10-29 13:20:02
asal
375 orang telah melayarinya

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

Pengawal Skop dalam C 11

Salah satu kelebihan utama ungkapan lambda C 11 terletak pada keupayaan mereka untuk menyatakan konsep RAII ( Pemerolehan Sumber Adalah Permulaan) dengan cara yang ringkas dan elegan. Pelaksanaan tradisional RAII bergantung pada pemusnah untuk melepaskan sumber, tetapi dengan ungkapan lambda, adalah mungkin untuk mencipta objek yang akan melaksanakan fungsi pembersihan apabila keluar dari skopnya, tanpa mengira cara keluar itu berlaku. Ini dikenali sebagai pengawal skop.

Pelaksanaan Pengawal Skop Mudah

Berikut ialah contoh pelaksanaan pengawal skop mudah dalam 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>
Salin selepas log masuk

Kelas ScopeGuard menggunakan ungkapan lambda sebagai hujah pembinanya, yang mewakili tindakan pembersihan yang akan dilaksanakan apabila pengawal skop keluar dari skop. Bendera komited menunjukkan sama ada tindakan pembersihan telah dilaksanakan.

Penggunaan

Kelas ScopeGuard boleh digunakan untuk memastikan sumber dikeluarkan dengan betul, walaupun pengecualian berlaku . Sebagai contoh, fungsi berikut memperoleh sumber dan memastikan ia dilepaskan menggunakan pengawal skop:

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

Dalam contoh ini, ScopeGuard digunakan untuk memastikan elemen dikeluarkan daripada vektor walaupun jika pengecualian berlaku.

Kesimpulan

Pengawal skop ialah alat yang berkuasa untuk memastikan sumber dikeluarkan dengan betul dalam C 11. Pelaksanaan mudah yang dibentangkan di sini ialah cara yang mudah untuk dilaksanakan corak ini. Walau bagaimanapun, terdapat pelaksanaan yang lebih kompleks yang menawarkan ciri tambahan, seperti keupayaan untuk memindahkan pemilikan sumber antara pengawal skop.

Atas ialah kandungan terperinci Bagaimanakah C 11 Lambda Expressions boleh Digunakan untuk Melaksanakan Pengawal Skop?. 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