2 Stimmen

Find/Replace Using C++ Macro? Finden/Ersetzen mit C++-Makro?

Ich habe einen Fall, in dem ich ein Makro verwende, um einfache Unterklassen zu generieren. Derzeit ist es wie folgt definiert:

#define REGISTER( TYPE, NAME )                     \
    struct NAME ## Class : public ParentClass      \
    {                                              \
        NAME ## Class () : ParentClass ( # NAME ); \
    }

Ich möchte wirklich, dass der Name einen Punkt enthält, aber dann wird das Makro erweitert und funktioniert nicht:

struct Simple.ClassClass : public ParentClass
{
    Simple.ClassClass () : ParentClass ("Simple.Class");
};

Gibt es eine Möglichkeit, mit einer Präprozessor-Definition den Punkt im Namen loszuwerden? Dann könnte ich den Punkt im String behalten (wie gewünscht) und den Klassennamen einen anderen (zulässigen) Zeichen verwenden lassen.

Der Klassenname spielt keine Rolle (solange er eindeutig ist). Das einzige, was zählt, ist der lesbare String.

Ich habe Zugriff auf Boost.Preprocessor, aber ich konnte nicht verstehen, ob etwas davon nützlich wäre.

Danke.

BEARBEITEN: Der Grund dafür ist, dass ich die Industrial Strength Pluggable Factories als Vorlage und Makro für eine einfache Generierung der Herstellerklasse implementiere. Es könnte jedoch viele Hersteller-IDs geben, sodass ich die Möglichkeit haben möchte, sie durch einen Punkt "zu gruppieren". Derzeit mache ich es bereits mit Unterstrichen, ich war nur neugierig, ob ich es mit einem Punkt anstelle eines Unterstrichs zum Laufen bringen könnte, da ich es optisch ansprechender finde. Der einzige wichtige Teil ist, dass da ein anderer Mensch außer mir, der Code schreibt, den vom Makro generierten Code nicht sieht, das Makro also nichts Hinterlistiges im Hintergrund tun kann. Was auch immer als Name eingefügt wird, muss der Schlüssel sein, der zur Abfrage des Elements verwendet wird.

Ich habe das Problem heute Morgen wieder angesehen und glaube, ich kann Makros einfach ganz vermeiden. Trotzdem vielen Dank.

2voto

AndersK Punkte 34870

Warum erstellen Sie stattdessen nicht ein kleines eigenständiges Programm, das die Klassendeklarationen in einer .h-Datei generiert? Auf diese Weise müssen Sie nicht mit Makros herumspielen und haben viel mehr Kontrolle.

2voto

Ich denke nicht, dass Sie den Parameter NAME in irgendeiner Weise manipulieren können, außer ihn mit einem anderen String zu verketten. Die offensichtliche Lösung besteht also darin, keinen String zu verwenden, der Punkte enthält.
REGISTER(whateverType, SomethingwithoutDot)

Ich weiß, das beantwortet nicht Ihre Frage, aber mir scheint, dass Sie das Problem, das Sie mit diesem Makro lösen möchten, genauer betrachten sollten und vielleicht einen anderen Weg finden sollten, um dieses Problem zu lösen. Ich denke, das wäre produktiver.

1voto

Remy Lebeau Punkte 498719

Vielleicht nicht das, wonach Sie suchen, aber warum fügen Sie nicht einfach einen zusätzlichen Parameter zur Makro hinzu?

#define REGISTER( TYPE, PREFIX, NAME )               \ 
    struct PREFIX ## Class : public ParentClass      \ 
    {                                                \ 
        PREFIX ## Class () : ParentClass ( # NAME ); \ 
    } 

REGISTER(SomeType, Simple, Simple.Class);

0voto

Donotalo Punkte 12360

Nicht deine Antwort, sondern ein Workaround. Wenn du mit dem Klassennamen SimpleClass anstelle von SimpleClassClass zufrieden bist, dann sollte das funktionieren:

#define REGISTER( TYPE, NAME )                     \
struct NAME ## Class : public ParentClass      \
{                                              \
    NAME ## Class () : ParentClass ( # NAME ".Class" ){} \
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X