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

आप एसटीएल या बूस्ट लाइब्रेरीज़ पर भरोसा किए बिना C++ में \"defer\" सुविधा कैसे कार्यान्वित कर सकते हैं?

2025-01-27 को प्रकाशित
ब्राउज़ करें:418

How can you implement a \

सी में "डिफ़र" फ़ीचर का कस्टम कार्यान्वयन

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

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer

उपयोग:

defer मैक्रो का उपयोग एक विशिष्ट दायरे के भीतर कोड के एक ब्लॉक को परिभाषित करने के लिए किया जा सकता है जिसे उस दायरे के समाप्त होने पर निष्पादित किया जाएगा। सिंटैक्स इस प्रकार है:

defer {
    // Code to be executed at the end of the current scope
};

उदाहरण:

निम्नलिखित उदाहरण में, फ़ंक्शन से बाहर निकलने पर इनपुट फ़ाइल को स्वचालित रूप से बंद करने के लिए read_entire_file फ़ंक्शन के भीतर defer मैक्रो का उपयोग किया जाता है:

#include 
#include 

bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) {
    if (!filename)
        return false;

    auto file = std::fopen(filename, "rb");
    if (!file)
        return false;

    defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

    // ... Remaining code
}

लाभ:

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

नोट:

  • नेमस्पेस प्रदूषण से बचने के लिए स्थानीय डिफ़रर ऑब्जेक्ट का नाम _ के बजाय zz_ से शुरू होता है।
  • उपयोगकर्ता पहचानकर्ताओं को तकनीकी रूप से अंडरस्कोर से शुरू नहीं करना चाहिए।
नवीनतम ट्यूटोरियल अधिक>

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

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

Copyright© 2022 湘ICP备2022001581号-3