فهم 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
توضيح الوسيطة الثانية
في التدوين:
template::value, int>::type = 0>
void foo(const T& bar) { isInt(); }
يتم استخدام = 0 لتعيين معلمة القالب الثاني بشكل افتراضي. يتيح ذلك استدعاء كلا الخيارين باستخدام foo
تفاصيل جديرة بالملاحظة
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3