"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنك تنفيذ ميزة \ "تأجيل \" في C ++ دون الاعتماد على مكتبات STL أو Boost؟

كيف يمكنك تنفيذ ميزة \ "تأجيل \" في C ++ دون الاعتماد على مكتبات STL أو Boost؟

نشرت في 2025-01-27
تصفح:799

How can you implement a \

من نطاق معين أو كتلة من الكود. بينما لا توفر المكتبة STL (مكتبة القالب القياسية) ومكتبات Boost تنفيذًا مدمجًا لهذه الميزة ، يمكن إنشاء حل مخصص باستخدام قصاصة الكود التالية:

struct defer_dummy {} ؛ قالب struct deferrer {f f ؛ ~ deferrer () {f () ؛ }} ؛ قالب deferrer عامل التشغيل*(defer_dummy ، f f) {return {f} ؛ } #define defer_ (line) ZZ_Defer ## Line #Define Defer (Line) Defer_ (Line) #define تأجيل التأجيل التلقائي (__ line__) = defer_dummy {} *

() #ENDIF // DEFER

بناء الجملة كما يلي:
#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
تأجيل { // الرمز المراد تنفيذه في نهاية النطاق الحالي } ؛

مثال:

في المثال التالي ، يتم استخدام الماكرو المؤجل ضمن دالة read_entire_file لإغلاق ملف الإدخال تلقائيًا عند خروج الوظيفة:
#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
#تضمين #include bool read_entire_file (char *filename ، std :: uint8_t *& data_out ، std :: size_t *size_out = nullptr) { إذا (! اسم الملف) العودة كاذبة ملف auto = std :: fopen (اسم الملف ، "RB") ؛ إذا (! ملف) العودة كاذبة تأجيل {std :: fclose (ملف) ؛ } ؛ // لا تحتاج إلى كتابة ملف ملف RAII. // ... الكود المتبقي }

الفوائد:

#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
موجزة بشكل تجاري:

تم تصميم بناء الجملة ليكون من السهل القراءة والاستخدام. ترجمة أوقات الترجمة. &&&]

يبدأ اسم كائن التوجيه المحلي بـ ZZ_ بدلاً من _ لتجنب تلوث مساحة الاسم.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3