اختيار وظيفة العضو باستخدام شروط Enable_If
تتمثل المهمة في تحديد استدعاء وظيفة العضو بناءً على معلمة قالب الفئة. يحاول مقتطف التعليمات البرمجية التالي تحقيق ذلك:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout ومع ذلك، فشل تجميع هذا الرمز بسبب الخطأ "لا يوجد نوع مسمى 'type' في 'struct std::enable_if'".
SFINAE in Action
يكمن مفتاح فهم هذه المشكلة في مفهوم فشل الاستبدال ليس خطأ (SFINAE). يسمح Enable_if بالتجميع الشرطي استنادًا إلى وسيطات القالب. في هذه الحالة، تكون وسيطة القالب 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 منع التخصص الصريح لوظائف الأعضاءكما أشار HostileFork، يسمح الكود الأصلي بالمواصفات الصريحة لوسائط القالب لوظائف الأعضاء، مما قد يؤدي إلى نتائج غير صحيحة. لمنع ذلك، يمكننا إضافة static_assert الذي يتحقق من توفير أي وسيطات للقالب. وهذا يضمن أن وظيفة العضو الصحيحة يتم استدعاؤها دائمًا بناءً على وسيطة القالب T. سيكون الرمز المعدل هو:
template
نقطة الهيكل
{
القالب
اسم النوع std::enable_if<:is_same int>::value>::type
دالتي()
{
static_assert(sizeof...(Dummy)==0, "لا تحدد وسيطات القالب!");
std::cout
اسم الكتابة std::enable_if<:is_same float>::value>::type
دالتي()
{
static_assert(sizeof...(Dummy)==0, "لا تحدد وسيطات القالب!");
std::cout
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3