"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++11 लैम्ब्डा एक्सप्रेशंस का उपयोग स्कोप गार्ड्स को लागू करने के लिए कैसे किया जा सकता है?

C++11 लैम्ब्डा एक्सप्रेशंस का उपयोग स्कोप गार्ड्स को लागू करने के लिए कैसे किया जा सकता है?

2024-11-14 को प्रकाशित
ब्राउज़ करें:665

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

सी 11 में स्कोप गार्ड्स

सी 11 लैम्ब्डा अभिव्यक्तियों के मुख्य लाभों में से एक आरएआईआई की अवधारणा को व्यक्त करने की उनकी क्षमता में निहित है ( संसाधन अधिग्रहण आरंभीकरण है) संक्षिप्त और सुरुचिपूर्ण ढंग से। RAII का पारंपरिक कार्यान्वयन संसाधनों को जारी करने के लिए विध्वंसकों पर निर्भर करता है, लेकिन लैम्ब्डा अभिव्यक्तियों के साथ, एक ऑब्जेक्ट बनाना संभव है जो अपने दायरे से बाहर निकलने पर एक क्लीनअप फ़ंक्शन निष्पादित करेगा, भले ही वह निकास कैसे होता है। इसे स्कोप गार्ड के रूप में जाना जाता है।

सरल स्कोप गार्ड कार्यान्वयन

यहां सी 11 में एक सरल स्कोप गार्ड कार्यान्वयन का एक उदाहरण है:

template

स्कोपगार्ड वर्ग अपने कंस्ट्रक्टर तर्क के रूप में एक लैम्ब्डा अभिव्यक्ति लेता है, जो स्कोप गार्ड के दायरे से बाहर जाने पर निष्पादित होने वाली सफाई कार्रवाई का प्रतिनिधित्व करता है। प्रतिबद्ध ध्वज इंगित करता है कि सफाई कार्रवाई निष्पादित की गई है या नहीं। . उदाहरण के लिए, निम्नलिखित फ़ंक्शन एक संसाधन प्राप्त करता है और यह सुनिश्चित करता है कि इसे स्कोप गार्ड का उपयोग करके जारी किया गया है:

voidSomeFuncThatShouldBehaveAtomallyInCaseOfExceptions() { एसटीडी::वेक्टर myVec; एसटीडी::वेक्टर कुछअन्यVec; myVec.push_back(5); // पहला कंस्ट्रक्टर, एडक्वायर कहीं और होता है स्थिरांक ऑटो& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } ); //सिंटैक्टिक रूप से साफ-सुथरा, क्योंकि सब कुछ एक ही पंक्ति में होता है स्थिरांक ऑटो& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); } , [&]() { someOtherVec.pop_back(); } ); बी.प्रतिबद्ध(); a.प्रतिबद्ध(); }

इस उदाहरण में, स्कोपगार्ड का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि अपवाद होने पर भी तत्वों को वैक्टर से हटा दिया जाता है।

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();
}

स्कोप गार्ड यह सुनिश्चित करने के लिए एक शक्तिशाली उपकरण है कि सी 11 में संसाधनों को ठीक से जारी किया गया है। यहां प्रस्तुत सरल कार्यान्वयन इस पैटर्न को लागू करने का एक सीधा तरीका है। हालाँकि, अधिक जटिल कार्यान्वयन हैं जो अतिरिक्त सुविधाएँ प्रदान करते हैं, जैसे स्कोप गार्ड के बीच संसाधनों के स्वामित्व को स्थानांतरित करने की क्षमता।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3