"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا لا تعمل SFINAE مع وظائف الأعضاء في قوالب الفصل؟

لماذا لا تعمل SFINAE مع وظائف الأعضاء في قوالب الفصل؟

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

Why Doesn't SFINAE Work with Member Functions of Class Templates?

لماذا لا يعمل SFINAE (enable_if) لوظائف الأعضاء في قالب الفصل؟

في لغة C، يتيح لك SFINAE (فشل الاستبدال ليس خطأ) تمكين أو تعطيل التعليمات البرمجية اعتمادًا على نوع وسيطة القالب. ومع ذلك، عند التعامل مع وظائف الأعضاء في قالب الفصل الدراسي، غالبًا لا يعمل SFINAE كما هو متوقع.

إليك مثال يوضح المشكلة:

#include 

struct A {};
struct B {};

template 
struct Foo
{
    typename std::enable_if<:is_same a>::value>::type bar()
    {}

    typename std::enable_if<:is_same b>::value>::type bar()
    {}
};
في هذا المثال، يحدد Foo اثنين من وظائف الأعضاء المحملة بشكل زائد bar(). يتم تمكين التحميل الزائد الأول عندما يكون T هو A، ويتم تمكين الثاني عندما يكون T هو B. ومع ذلك، إذا حاولت ترجمة هذا الرمز، فستتلقى رسالة خطأ تشير إلى أنه لا يمكن حل التحميل الزائد.

سبب هذا الخطأ هو أن SFINAE يعمل فقط مع وسيطات القالب

المستنتجة. في حالة وظائف الأعضاء في قالب فئة، لا يتم استنتاج وسيطة القالب بل يتم تحديدها بشكل صريح. لإصلاح المشكلة، يمكنك استخدام أحد الأساليب التالية:

    استخدام وسيطات القالب الصريحة:
  • struct Foo { شريط فارغ (أ) {} شريط فارغ (ب) {} };

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • استخدم std::enable_if داخل وظائف العضو:
  • قالب هيكل فو { القالب اسم النوع std::enable_if<:is_same a>::value>::type bar() {} القالب اسم النوع std::enable_if<:is_same b>::value>::type bar() {} };

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • استخدام تخصص قالب الفصل الصريح:
  • template struct Foo { void bar() {} }; القالب struct Foo { void bar() {} };

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3