Frage

Gibt es eine Möglichkeit zu überprüfen, was die type_info einer Oberklasse ist?In meinem System werden Objekte durch eine Reihe von Bits identifiziert.Dies wird durch den Hashcode type_info identifiziert.Ich möchte, dass einige dieser Typen Polymorphismus in dem Sinne ermöglichen, dass mein System denkt, dass sie sich unter demselben Bit befinden.type_info erstellt für jeden Klassentyp einen eindeutigen Hashcode.Stattdessen möchte ich, dass die abgeleiteten Klassen den Bitsatz ihrer Oberklasse wie folgt übernehmen:

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

Dies sollte das Objekt, das die Komponenten enthält, einem System zur Verarbeitung hinzufügen.

Ab sofort ist es das, was passiert:

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

Was erfordert, dass ich für alle Komponenten unterschiedliche Systeme erstelle.

Wenn mir jemand Hinweise geben könnte, wie ich das erreichen könnte, wäre das großartig.

Bearbeiten:Um Verwirrung zu vermeiden, um ein Bit für einen Typ zu setzen, geht es wie folgt vor:Komponententypmanager::getBit();

Ich arbeite also nicht mit Instanzen.Und ich würde das aktuelle System gerne unter Verschluss halten.

War es hilfreich?

Lösung

Es gibt keinen automatischen Weg, den ich kenne.Wenn ich Sie jedoch verstehe, kann dies mit wenig zusätzlichem Aufwand geschehen.

Fügen Sie für jede Ihrer 'Basisklassen' ein typedef hinzu, das auf sich selbst verweist, und verwenden Sie dieses stattdessen in der typeid().Beachten Sie, dass Unterklassen dies überschreiben können.Wenn sie dies tun, erhalten sie ihre eigene ID und ihre Kinder werden ihren Wert verwenden.

Beachten Sie eine andere Lösung, wenn Sie nicht verwenden möchten typeid() es geht überhaupt darum, ein statisches Element (oder eine Elementfunktion) für die Basisklassen zu haben, das den richtigen Wert für die Basis zurückgibt, und diesen dann direkt in Ihrer getBit () -Funktion aufzurufen.

#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

Andere Tipps

Warum nicht einfach eine Variable in der Basisklasse erstellen ISomeInterFaceComponent dies wird von abgeleiteten Klassen nicht geändert (es sei denn, Sie möchten dies ausdrücklich).Es hört sich nicht so an, als ob Sie Polymorphismus wollen, da der Bitwert der sein soll gleich unabhängig vom abgeleiteten Klassentyp, anstatt je nach Typ zu variieren.Wenn Sie in Zukunft if für einen bestimmten abgeleiteten Typ überschreiben müssen, können Sie dies immer noch speziell für diese Klasse tun.

Alternativ könnten Sie eine virtuelle Funktion in der Basisklasse verwenden, die ein int (den Bitwert - oder welchen Typ auch immer dies tatsächlich ist) zurückgibt und es einfach nicht in den abgeleiteten Klassen überschreibt, die denselben Bitwert wie die Basis haben sollen.

Beispielsweise

 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.
 };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top