Ist es möglich, eine Zeichenfolge zu erhalten, die zur Kompilierungszeit den Namespace und den Klassennamen enthält?

8

Ich frage mich, wie man einen Makro definiert, der für einen gegebenen Klassennamen seinen Namensraum und seinen Klassennamen in einem Format wie folgt ausgibt: "Namespace.SubNamespace.ClassName"?

Also schreibe so etwas:

%Vor%

Ich möchte str "NS.SNS.MyClass" erhalten. Ich würde es lieben, wenn dieses Makro so weit wie möglich Parameter (also eins oder keine) hätte.

Alternativ frage ich mich, ob so etwas mit Vorlagen wie etwa:

gemacht werden kann %Vor%

Wie man so etwas macht (boost, stl und nur C ++ 03 zur Hand)?

    
DuckQueen 02.12.2013, 10:25
quelle

2 Antworten

3

Es gibt keine Standardmethode, dies zu tun. Das einzige Standard-Makro, das Informationen über den Gültigkeitsbereich liefert, ist das C99-Makro __func__ .

Was Sie tun können, ist, den Namen des Symbols durch std::typeinfo zu erhalten und dann in eine Compiler-spezifische API zum Entmelden zu werfen und dann den Namespace zu analysieren.

Ссылка gibt Beispiele, wie man das macht. Dies sollte mit clang und OS X funktionieren.

Alternativ können Sie eine Reihe von Makros schreiben, um Namespaces und eine entsprechende statische Zeichenkette zu definieren und dann Ihre Strings von dort aus zu hacken.

Keine der Optionen wird besonders schön sein.

    
pmr 02.12.2013 10:36
quelle
1

Dies ist kein Kompilierungszeitansatz, aber es kann Ihnen geben, was Sie wollen.

Sie können versuchen, etwas wie:

%Vor%

Begraben in der Ausgabe sehe ich:

%Vor%

Sie können auch demangle.h , obwohl ich mir nicht sicher bin, wie du den entstellten Namen bekommen würdest (typeid gibt mir nicht viel.)

Sie können auch Boost Reflect , Boost-Typ-Merkmale , Reflex oder klingeln. Sie können möglicherweise eine Art der Reflektion mithilfe der API von clang durchführen.

    
user1508519 02.12.2013 10:54
quelle

Tags und Links