الكشف عن هياكل STL مع سمات النوع: دليل إلى is_container و is_vector
مقدمة
توفر سمات الكتابة آلية قوية للاستعلام عن الأنواع في وقت الترجمة. وهذا يمكّن المبرمجين من كتابة تعليمات برمجية مرنة ومحسنة للغاية. إحدى حالات الاستخدام الشائعة هي الكشف عن هياكل STL، مثل المتجهات والمجموعات والخرائط.
تعريف is_vector
لتحديد ما إذا كان النوع يمثل متجهًا، يمكننا استخدامه إصدار متخصص من الوظيفة metafunction_enable_if من Boost. يتيح لنا ذلك تخصيص سمة نوع is_vector بشكل مشروط بناءً على تشابه النوع مع std::vector.
ومع ذلك، قد يواجه التنفيذ التالي أخطاء في الترجمة بسبب معلمات القالب غير المستخدمة:
template
struct is_vector {
static bool const value = false;
};
template
struct is_vector> >::type> {
static bool const value = true;
};
طريقة بديلة لاكتشاف حاويات STL
توفر تقنية SFINAE (فشل الاستبدال ليس خطأ) طريقة بديلة لاكتشاف الحاويات المشابهة لـ STL. إليك التنفيذ:template
struct is_container : std::false_type {};
template
struct is_container_helper {};
template
struct is_container().size()),
decltype(std::declval().begin()),
decltype(std::declval().end()),
decltype(std::declval().cbegin()),
decltype(std::declval().cend())
>,
void
>
> : public std::true_type {};
تتحقق سمة النوع هذه من وجود طرق وأنواع محددة شائعة في حاويات STL. إذا نجحت جميع عمليات التحقق، فسيتم تقييم سمة النوع على أنها صحيحة.
اكتشاف حاويات STL فقط
لتقييد الاكتشاف بحاويات STL على وجه التحديد، يمكنك إزالة التحقق من T ::allocator_type لأنه ليس عضوًا مطلوبًا لجميع حاويات STL.الاستنتاج
مع سمات النوع المتوفرة، يمكنك بسهولة تحديد ما إذا كان النوع المحدد عبارة عن بنية STL أو ناقل على وجه التحديد. تعتبر هذه التقنيات ضرورية للبرمجة الفوقية المتقدمة وتحسين أداء التعليمات البرمجية.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3