Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah C 11 Lambda Expressions boleh Digunakan untuk Melaksanakan Pengawal Skop?
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& _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; } };</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& 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>
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!