सी में "डिफ़र" फ़ीचर का कस्टम कार्यान्वयन
सी में, "डिफ़र" की अवधारणा में अंत में विशिष्ट कार्यों को निष्पादित करना शामिल है किसी विशेष दायरे या कोड के ब्लॉक का। जबकि एसटीएल (स्टैंडर्ड टेम्प्लेट लाइब्रेरी) और बूस्ट लाइब्रेरी इस सुविधा का अंतर्निहित कार्यान्वयन प्रदान नहीं करते हैं, निम्नलिखित कोड स्निपेट का उपयोग करके एक कस्टम समाधान बनाया जा सकता है:
#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
}
लाभ:
नोट:
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3