Eindeutige Klassentyp-ID, die sicher ist und Bibliotheksgrenzen überschreitet

7

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!     
xeon 28.05.2009, 18:22
quelle

9 Antworten

2

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.

    
xeon 29.05.2009, 19:04
quelle
9

Dies kann mit sehr wenig Code gemacht werden:

%Vor%     
Ben Voigt 07.10.2011 19:44
quelle
8

Im modernen C ++ (03 - vorausgesetzt, Sie verwenden einen neueren Compiler wie gcc) können Sie den typid Schlüsselwort, um ein type_info-Objekt zu erhalten, das zumindest zur Laufzeit grundlegende Typinformationen liefert - das ist eine standardmäßige (und dann plattformübergreifende) Funktion .

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.

    
Klaim 28.05.2009 22:26
quelle
2

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.

    
Jherico 28.05.2009 18:41
quelle
2

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%     
Alex 14.01.2016 09:28
quelle
1

Es gibt nichts standardisiertes. Außerdem gibt es keinen Hack, den ich gefunden habe, der narrensicher ist.

Beste, die ich mir vorstellen konnte:

%Vor%     
James Curran 28.05.2009 18:35
quelle
1

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

    
Todd Gardner 28.05.2009 20:45
quelle
0

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.

    
Skurmedel 28.05.2009 18:38
quelle
0
%Vor%     
user6567423 10.01.2018 17:06
quelle

Tags und Links