Ich würde jede Hilfe schätzen, da C ++ nicht meine primäre Sprache ist.
Ich habe eine Template-Klasse, die in mehreren Bibliotheken abgeleitet ist. Ich versuche herauszufinden, wie ich einer abgeleiteten Klasse eine ID int eindeutig zuweisen kann. Ich muss es jedoch von einer statischen Methode aus tun können, dh.
%Vor% Vielen Dank!
Hier ist, was ich getan habe. Wenn Sie Feedback (Pros, Contra) haben, lassen Sie es mich bitte wissen.
%Vor%
Im Wesentlichen wird die ID nach einem Zeichenkettenvergleich und nicht nach einem Zeigervergleich zugewiesen. Dies ist in Bezug auf die Geschwindigkeit nicht ideal, aber ich habe die ID statisch const gemacht, so dass sie nur einmal für jede DERIVED berechnet werden muss.
Im modernen C ++ (03 - vorausgesetzt, Sie verwenden einen neueren Compiler wie gcc) können Sie den typid
Ich nahm das Beispiel aus Wikipedia und fügte eine Vorlage / Vererbungsprüfung hinzu, es scheint gut zu funktionieren, aber ich bin nicht sicher für die int-Version (das ist ein Hack, der die Annahme ausnutzt, dass der Compiler irgendwo die Typennamen hat) ein schreibgeschützter Speicherbereich ... das könnte eine falsche Annahme sein).
Die Zeichenfolge-ID scheint für die plattformübergreifende Identifizierung viel besser zu sein, wenn Sie sie in Ihrem Fall verwenden können. Es ist nicht Cross-Compiler-kompatibel, da der Name, den es Ihnen gibt, vom Standard "Implementierung definiert" ist - wie in Kommentaren vorgeschlagen.
Der vollständige Testanwendungscode:
%Vor%Ausgaben:
%Vor%Dies funktioniert zumindest auf VC10Beta1 und VC9, sollte auf GCC funktionieren. Um typid (und dynamic_cast) zu verwenden, müssen Sie übrigens Laufzeittyp-Informationen in Ihrem Compiler zulassen. Es sollte standardmäßig aktiviert sein. Auf einigen Plateform / Compiler (ich denke über einige eingebettete Hardwares) RTTI ist nicht eingeschaltet, weil es eine Kosten haben, so dass Sie in einigen extremen Fällen eine bessere Lösung finden müssen.
In meiner vorherigen Firma haben wir dies getan, indem wir einen Makro erstellt haben, der den Klassennamen als Parameter annehmen, eine lokale Statik mit der eindeutigen ID (basierend auf dem Klassennamen) erstellen und dann eine Überschreibung einer virtuellen Funktion erzeugen würde Basisklasse, die das statische Element zurückgegeben hat. Auf diese Weise können Sie die ID zur Laufzeit von einer beliebigen Instanz der Objekthierarchie abrufen, ähnlich der 'getClass ()' Methode in einem Java-Objekt, obwohl viel primitiver.
Ich bin mit den bisherigen Antworten nicht 100% zufrieden und habe eine Lösung für mich ausgearbeitet. Die Idee ist, einen Hash des Typnamens mit typeinfo zu berechnen. Beim Laden der Anwendung wird alles einmal ausgeführt, sodass keine Laufzeitüberlastung auftritt. Diese Lösung funktioniert auch unter Verwendung von gemeinsam genutzten Bibliotheken, da der Typname und der Hash-Wert konsistent sind.
Dies ist der Code, den ich verwende. Das funktioniert gut für mich.
%Vor%Es gibt nichts standardisiertes. Außerdem gibt es keinen Hack, den ich gefunden habe, der narrensicher ist.
Beste, die ich mir vorstellen konnte:
%Vor%Welche Art von ID? Suchen Sie nach einem atomar wachsenden Int? Wenn eine Zeichenfolge in Ordnung ist, was ist mit:
%Vor%Wenn es ein int sein muss, aber nicht automatisch erhöht, können Sie das für eine 128-Bit-Ganzzahl, die wahrscheinlich keine Kollisionen hat (obwohl wahrscheinlich eine größere Anzahl als Sie brauchen) hashen
Sie können Folgendes tun:
%Vor% Ich weiß nicht, ob es eine gute Idee ist. Der blah<>
-Teil ist auch etwas unintuitiv. Vielleicht sollten Sie sie besser manuell zuweisen, oder Sie können einen Basistyp erstellen, geben Sie ihm ein Template-Argument mit Ihrer Klassen-ID.