Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

21.11.2012, 10:29

Schleifen im Preprozzesor (Variadic Macros)

Hi Leute,
Ich hab folgende Problem ich versuch mit mit hilfe von Macros das Leben zu erleicht das is aber anscheinend nicht so einfach.
Also ich will ein Macro machen wo ich z.b. eine beliebige Anzahl an Parameter übergeben kann.
Jetzt gibt es keine richtige for-Schleife für den Preprozzesor, ich dachte mir das so was so ausehen könnte:

C-/C++-Quelltext

1
2
3
4
5
6
#define DO_FOO(T,VAR) T::funk(bla,"VAR",this->VAR);
#define FOO(T,...) \   FOR(VAR as __VA_ARGS__)          DO_FOO(T,VAR) 

Foo(Bar, a,b,i) ///< Bar::funk(bla,"a",this->i);     Bar::funk(bla,"b",this->b);     Bar::funk(bla,"i",this->i);

Foo(Bar, a,b,i,arr) ///< Bar::funk(bla,"a",this->i);     Bar::funk(bla,"b",this->b);     Bar::funk(bla,"i",this->i);     Bar::funk(bla,"arr",this->arr);

Ich hab dann vom Boost.Prepro. gehört aber ich weiß nicht wie ich das diese FOR schleife benutzen kann.


Jetzt hab ich aber eine Lösung gefunden die funktioniert, nur ist diese Lösung anscheinend nicht so dynamisch:
http://psomas.wordpress.com/2011/08/29/a…c-preprocessor/

http://jacquesmattheij.com/C+Preprocessor+Hell


Das funkioniert aber nur für die Anzahl an Parameter wie viele ich FELD_N ich definiert hab.
Jetzt ist die Frage geht das nicht besser und dynamischer.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.11.2012, 10:31

Was genau willst du denn damit erreichen, wofür brauchst du das?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

21.11.2012, 13:09

Wenn ich das lese wird mir etwas übel... Sieht auf jeden Fall nach Ärger aus.
Ich bezweifle, dass es dir dein "Leben erleichtern wird", eher das Gegenteil wird der Fall sein.

Trotzdem würde mich die Antwort auf Dots Frage interessieren.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

4

21.11.2012, 13:55

Also im grunde versuch ich mir das Serializiren von Objecten zu vereinfachen.
Entweder als Binary oder JSON.
Dazu benutzt ich den std::stream oder die rapidjson Library.
Und ich hab mir einige Funktionen geschreiben die mir die Klassen Member in den Format in den Stream schreiben/lesen.
Und was ich dann ja machen müsste ist die Methoden für die Binary zu überschreiben und für das Json obwohl die Funktionen gleich auf gebaut sind.
Und da die gleich aufgebaut sind wollte ich das mit Macros machen.

C-/C++-Quelltext

1
2
3
4
5
std::ostream& Foo::writeBinary(std::ostream& stream){    FileBinary::writeBinary(stream,this->a);    FileBinary::writeBinary(stream,this->i);    FileBinary::writeBinary(stream,this->d);             FileBinary::writeBinary(stream,this->arr);

       return stream;}
rapidjson::Writer& Foo::writeJson(rapidjson::Writer& stream){    FileJson::writeJson(stream,"a",this->a);    FileJson::writeJson(stream,"i,"this->i);    FileJson::writeJson(stream,"d",this->d);    FileJson::writeJson(stream,"arr",this->arr);
   return writer;}

Das einzige was ich da ändert sind die Member.
Und da Wollte ich mir einfach ein Macro schreiben das mir die Methoden Imp. erzeugt und ich da nur die Member angeben muss.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

21.11.2012, 14:14

Anderer Vorschlag:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::ostream& write(std::ostream& stream, ...)
{
  ...
}

rapidjson::Writer& write(rapidjson::Writer& stream, ...)
{
  ...
}


template <class Stream>
Stream& Foo::write(Stream& stream)
{
    write(stream, "a", this->a);
    write(stream, "i," this->i);
    write(stream, "d", this->d);
    write(stream, "arr", this->arr);
    return stream;
}

6

22.11.2012, 09:09

Je nach Laune kann man sich auch sowas basteln:

C-/C++-Quelltext

1
2
3
4
5
template <class Stream>
Stream& Foo::write(Stream& stream)
{
    return stream & t(a) & t(i) & t(d) & t(arr);
}

Damit es noch kompakter ist. Boost serialization macht das so ähnlich.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige