Makros Parameterübergabe (Trennung durch Kommata)
-
Hallo,
ich möchte ein paar Getter/Setter als Makros definieren (bewusst nicht als Inline-Funktionen).
Nun habe ich folgendes Attribut in einer Klasse:
map<int, Punkte*>* Blablup;Mit folgender Anweisung möchte ich eine Getter-Methode Expandieren:
GetMacro(Blablup, map<int, Punkte*>*);Die dazugehörige Makrodefinition lautet folgendermaßen:
#define GetMacro(name, type) virtual type Get##name () { return this->name; }Durch das Komma innerhalb von "map<int, Punkte*>*" erhalte ich eine Fehlermeldung, da der Präprozessor dies als 2 Parameter erkennt.
Wie kann ich das hinkriegen?
Vielen Dank im Voraus.
-
1. wieso willst du das über ein makro lösen?
2. wenn du den eintrag map<...> in klammern setzt, sollte das gehen.
-
ghorst schrieb:
2. wenn du den eintrag map<...> in klammern setzt, sollte das gehen.
Ne. Geht nicht, weil das Trennungskomma in map als weiterer Parameter folgend erwartet wird.
Hmm. Obwohl das wohl das Wohl einer der Totsünden von C++ ist find ich interessant. Mal schauen, ob ich da was finden kann.

EDIT:
Dacht ichs doch, dass es geht. :p#define GetMacro(name,type) virtual type Get##name () { return this->name; } #define comma , class foo { std::map<int,float> f; GetMacro(f,std::map<int comma float>); };
-
ok, ihr trickser

Vielen Dank für den Vorschlag.
Gibts noch ne bessere Lösung Getter und Setter Quellcodesparend zu implementieren? Von mir aus auch mit Inline-Funktionen...
Ich hab nur keine Lust auf
inline int GetX() { return X; } inline int GetY() { return Y; } usw.Kann man das für die Variablen zusammenfassen?
Gibts da nicht irgendwas mit Templates? Kenne mich noch nicht so gut aus!Vielen Dank im Voraus.
-
Also in Visual C++ funktioniert das mit dem Komma, so wie man es sich normalerweise wünscht.
Ansonsten schau dir mal die Boost Preprocessor Bibliothek an, die haben da entsprechende Generatoren dafür.
-
Hmm. Eigentlich mache ich es ganz Normal mit Get usw. Es gibt ja UML Editoren, die dir gleich die Getter und Setter schreiben können.
Aber wenn du wirklich viele Daten hast, die zusammen gehören, kannst du ja ein struct machen und dann das struct zurückgeben, anstatt so viele Getter zu schreiben.
struct s { int a; int b; float c; std::vector<int> v; ... }; class foo () { s _s; public: s get_s ()const {return _s;} };
-
Also in Visual C++ funktioniert das mit dem Komma, so wie man es sich normalerweise wünscht.
Also da hab ich andere Erfahrungen gemacht.
----
Verwende einfach nen typedef.
-
Delerium schrieb:
Kann man das für die Variablen zusammenfassen?
Wieso willst du sparen? Hat das einen tieferen Grund oder bist du einfach nur zu faul?
Wenn es um die Faulheit geht, dann gibt es da durchaus bessere Möglichkeiten. Mit Visual Assist X kann man zum Beispiel Code-Snippets erstellen. Oder du benutzt einen entsprechenden UML-Editor, wie es drakon schon vorgeschlagen hat.Im allgemeinen gilt: Makros sind böse! Nur wenn es wirklich nicht anders geht, sollte man Makros verwenden.
Wenn du Makros einsetzt, um deiner Faulheit entgegen zu kommen, dann kann ich dir versprechen, dass deine Faulheit in Zukunft viel mehr zu leiden haben wird.Grüssli