Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah C 11 Lambda Expressions boleh Digunakan untuk Melaksanakan Pengawal Skop?

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

Susan Sarandon
Susan Sarandonasal
2024-10-29 13:20:02306semak imbas

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>

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>

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!

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