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

كيفية تحديد وظيفة عضو بناءً على معلمة القالب باستخدام "enable_if"؟

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

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

اختيار وظيفة العضو باستخدام شروط 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