"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يعمل `std::enable_if`: كشف أسرار تنفيذه واستخدامه؟

كيف يعمل `std::enable_if`: كشف أسرار تنفيذه واستخدامه؟

تم النشر بتاريخ 2024-11-12
تصفح:718

How Does `std::enable_if` Work: Unraveling the Mysteries of Its Implementation and Usage?

فهم std::enable_if: فك رموز الغرض منه وتنفيذه

على الرغم من أن طبيعة std::enable_if يتم استيعابها في سياقات معينة، إلا أنها تظل التعقيدات، وخاصة الوسيطة الثانية والتخصيص لـ std::enable_if ضمن بيان القالب، غامضة. سيؤدي التعمق في أعماله إلى كشف هذه الألغاز.

أساسيات std::enable_if

std::enable_if هو قالب متخصص محدد على النحو التالي:

template struct enable_if {};
template struct enable_if { typedef T type; };

بشكل حاسم، يتم تعريف نوع الاسم المستعار typedef T فقط عندما يكون Cond صحيحًا.

الكشف عن الاستخدام

ضع في اعتبارك التصريح التالي:

template
typename std::enable_if<:numeric_limits>::is_integer, void>::type foo(const T &bar) { isInt(bar); }

هنا، يتم تعريف نوع الإرجاع لـ foo بواسطة std::enable_if<:numeric_limits>::is_integer, void>::type. نظرًا لأن std::numeric_limits::is_integer هو شرط منطقي، فلن يتم تعريف نوع الإرجاع هذا إلا إذا كان الشرط صحيحًا.

توضيح الوسيطة الثانية

في التدوين:

template::value, int>::type = 0>
void foo(const T& bar) { isInt(); }

يتم استخدام = 0 لتعيين معلمة القالب الثاني بشكل افتراضي. يتيح ذلك استدعاء كلا الخيارين باستخدام foo(1)، بدلاً من طلب معلمتين للقالب إذا لم تكن المعلمة std::enable_if افتراضية.

تفاصيل جديرة بالملاحظة

  • تؤدي كتابة اسم الكتابة بشكل واضح std::enable_if<:condition t>::type إلى تحسين الوضوح.
  • في ج 14، Enable_if_t هو نوع ثابت يجب استخدامه لنوع الإرجاع، وتبسيطه إلى std::enable_if_t.
  • بالنسبة لإصدارات Visual Studio قبل عام 2013، يمكن فقط لنوع الإرجاع استخدام Enable_if.
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3