تحديد وظيفة عضو بشروط تمكين_if مختلفة
في لغة C، Enable_if هي أداة تستخدم لتمكين أو تعطيل تعليمات برمجية معينة بشكل مشروط بناءً على ما إذا كان وسيطة القالب تلبي معايير محددة. يمكن أن يكون هذا مفيدًا عندما تريد تخصيص سلوك فئة أو دالة استنادًا إلى معلمات القالب الخاصة بها.
في المثال المحدد، الهدف هو إنشاء وظيفة عضو MyFunction تتصرف بشكل مختلف بناءً على ما إذا كان القالب أم لا. المعلمة T عدد صحيح أم لا. التنفيذ المقصود هو استخدام حمولتين زائدتين لـ MyFunction، واحدة لـ T = int وواحدة لـ T != int.
إحدى الطرق لتحقيق ذلك هي من خلال Enable_if، كما هو موضح في الكود أدناه:
template
struct Point {
void MyFunction(
typename std::enable_if<:is_same int>::value, T >::type* = 0) {
std::cout ::value, float >::type* = 0) {
std::cout ومع ذلك، سيؤدي هذا الرمز إلى حدوث أخطاء في الترجمة بسبب الاستخدام غير الصحيح لـenable_if. في لغة C، يتم استبدال وسيطات القالب أثناء تحليل التحميل الزائد. في هذه الحالة، لا يحدث أي استبدال لأن نوع T معروف في وقت إنشاء مثيل لوظيفة العضو.
لإصلاح هذه المشكلة، يمكن تقديم معلمة قالب وهمية وتعيينها بشكل افتراضي إلى T، مما يسمح بـ SFINAE (فشل الاستبدال ليس خطأ) للعمل بشكل صحيح:
template
struct Point {
template
typename std::enable_if<:is_same int>::value>::type MyFunction() {
std::cout
typename std::enable_if<:is_same float>::value>::type MyFunction() {
std::cout يضمن هذا الأسلوب تحديد الإصدار الصحيح من MyFunction بناءً على قيمة T.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3