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

كيف يمكنك تحقيق تعدد الأشكال باستخدام أساليب القالب الافتراضي في C++؟

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

How can you achieve polymorphism with virtual template methods in C  ?

طريقة القالب الافتراضي C

في لغة C، قد يكون من الصعب الجمع بين تعدد أشكال الوقت الثابت (القوالب) وتعدد أشكال وقت التشغيل. يتضح هذا في الفئة المجردة التالية:

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};
يهدف هذا الفصل إلى تعيين واسترجاع البيانات من نوع محدد بناءً على معرف فريد. ومع ذلك، تنشأ مشكلة عند محاولة استدعاء وظيفة setData العامة بنوع معين، مثل setData("foodouble"، data).

تحظر اللغة هذه البنية لأن المترجم سيتعين عليه ديناميكيًا إرسال عدد لا حصر له من عمليات إنشاء القالب الممكنة. لحل هذه المشكلة، هناك عدة طرق ممكنة:

إزالة تعدد الأشكال الثابت:

    القضاء على تعدد الأشكال الثابت عن طريق تقديم نوع منفصل لتخزين قيمة المفتاح تعيينات. يمكن للقالب بعد ذلك حل هذه المشكلة على المستوى الأساسي، دون الحاجة إلى تعدد الأشكال:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

إزالة تعدد الأشكال الديناميكي:

الاحتفاظ بتعدد الأشكال في وقت التشغيل مع التخلص من تعدد الأشكال الثابت عن طريق محو النوع:
  • استخدام التعزيز::any, الذي يوفر محو النوع لتخزين البيانات من أي نوع:
  • class AbstractComputation { عام: القالب مجموعة باطلة (std::string const & id، T value) { setDataImpl( id, boost::any( value ) ); } القالب T getData( std::string const & id ) const { Boost::any res = getDataImpl(id); دفعة العودة::any_cast( res ); } محمي: Virtual void setDataImpl( std::string const & id, boost::any const & value) = 0; Virtual Boost::any getDataImpl( std::string const & id ) const = 0; };
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3