حراس النطاق في C 11
تكمن إحدى المزايا الرئيسية لتعبيرات C 11 lambda في قدرتها على التعبير عن مفهوم RAII ( الحصول على الموارد هو التهيئة) بطريقة موجزة وأنيقة. يعتمد التنفيذ التقليدي لـ RAII على أدوات التدمير لتحرير الموارد، ولكن باستخدام تعبيرات lambda، من الممكن إنشاء كائن ينفذ وظيفة التنظيف عند الخروج من نطاقه، بغض النظر عن كيفية حدوث هذا الخروج. يُعرف هذا باسم حارس النطاق.
تنفيذ بسيط لحارس النطاق
فيما يلي مثال على تطبيق بسيط لحارس النطاق في C 11:
templateتأخذ فئة ScopeGuard تعبير lambda كوسيطة منشئة، والتي تمثل إجراء التنظيف الذي سيتم تنفيذه عندما يخرج حارس النطاق عن النطاق. تشير العلامة الملتزمة إلى ما إذا كان قد تم تنفيذ إجراء التنظيف.
يمكن استخدام فئة ScopeGuard لضمان تحرير الموارد بشكل صحيح، حتى في حالة حدوث استثناء . على سبيل المثال، تحصل الدالة التالية على مورد وتضمن إصداره باستخدام حارس النطاق:
void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions()
{
الأمراض المنقولة جنسيا::vector myVec;
الأمراض المنقولة جنسيا::vector this.someOtherVec;
myVec.push_back(5);
// المنشئ الأول، يحدث الإعلان في مكان آخر
ثابت السيارات& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } );
// أكثر إتقانًا من الناحية اللغوية، حيث أن كل شيء يحدث في سطر واحد
ثابت السيارات& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); }
, [&]() { someOtherVec.pop_back(); } );
b.commit();
a.commit();
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();
}
الاستنتاج تعد حراس النطاق أداة قوية لضمان تحرير الموارد بشكل صحيح في C 11. يعد التنفيذ البسيط المعروض هنا طريقة مباشرة لتنفيذ هذا النمط. ومع ذلك، هناك تطبيقات أكثر تعقيدًا توفر ميزات إضافية، مثل القدرة على نقل ملكية الموارد بين حراس النطاق.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3