سؤال

هل هناك طريقة للتحقق من نوع type_info للفئة الفائقة؟يتم تحديد الكائنات في نظامي من خلال مجموعة من البتات.والذي يتم تحديده بواسطة رمز التجزئة type_info.أرغب في تمكين بعض هذه الأنواع من تعدد الأشكال، بمعنى أن نظامي يعتقد أنها تحت نفس الشيء.يقوم type_info بإنشاء رمز تجزئة فريد لكل نوع فئة.بدلاً من ذلك، أريد أن تأخذ الفئات المشتقة مجموعة البت من فئتها الفائقة كما يلي:

Component > ISomeInterfaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextB  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextC  -> bit = ISomeInterFaceComponent bit

يجب أن يضيف هذا الكائن الذي يحتوي على المكونات إلى نظام واحد للمعالجة.

وحتى الآن هذا ما يحدث:

Component > ISomeInterFaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = 00010
              |
              \  ComponentContextB  -> bit = 00100
              |
              \  ComponentContextC  -> bit = 01000

الأمر الذي يتطلب مني إنشاء أنظمة مختلفة لجميع المكونات.

إذا كان بإمكان أي شخص أن يعطيني مؤشرات حول كيفية تحقيق ذلك فسيكون أمرًا رائعًا.

يحرر:لمنع الارتباك للحصول على مجموعة بت لنوع ما، يتم الأمر كما يلي:ComponentTypeManager::getBit();

لذلك أنا لا أعمل مع الحالات.وأود أن أبقي النظام الحالي مغلقًا.

هل كانت مفيدة؟

المحلول

لا توجد أي طريقة تلقائية أعرفها.ومع ذلك، إذا كنت أفهمك، فيمكن القيام بذلك من خلال القليل من الجهد الإضافي.

لكل فئة من فئاتك "الأساسية"، أضف typedef الذي يشير إلى نفسه، واستخدمه بدلاً من ذلك في ملف typeid().لاحظ أن الفئات الفرعية يمكن أن تختار تجاوزها.إذا فعلوا ذلك، فسوف يحصلون على هويتهم الخاصة، وسيستخدم أطفالهم قيمتها.

ملاحظة، حل آخر، إذا كنت لا تريد استخدامه typeid() على الإطلاق، يجب أن يكون لديك عضو ثابت (أو وظيفة عضو) في الفئات الأساسية التي تُرجع القيمة المناسبة للقاعدة، ثم تستدعي ذلك مباشرة في وظيفة getBit() الخاصة بك.

#include <iostream>
#include <iomanip>
#include <typeinfo>

struct Base1 
{
   typedef Base1 Base;

};

struct Base2
{
   typedef Base2 Base;
};

struct Derived1A : public Base1 { };   
struct Derived1B : public Base1 { };    
struct Derived2A : public Base2 { };    
struct Derived2B : public Base2 { };

template <typename T>
std::size_t getBit()
{
   // Do whatever you normally do here, but use T::Base instead of T
   return std::hash<std::string>()(typeid(typename T::Base).name());
}

int main()
{ 
   std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";

   std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";

}

http://ideone.com/6ad08

نصائح أخرى

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

بدلاً من ذلك، يمكنك استخدام دالة افتراضية في الفئة الأساسية التي تُرجع int (قيمة البت - أو أي نوع كان هذا في الواقع) وببساطة لا تتجاوزها في الفئات المشتقة التي تريد أن يكون لها نفس قيمة البت مثل القاعدة.

على سبيل المثال

 class ISomeInterFaceComponent {
      virtual int GetBit() { return 1;};  // return bit value
 };


 class ComponentContextA : public ISomeInterFaceComponent {
      // Do not override GetBit() - let the base class function get called.
 };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top