Frage zu boost::bind und Parameter
-
Ich hätte da noch eine Frage:
Mit der Spriti-Libary habe ich mir folgende Grammtik definiert und mit bind will ich eben den real_p-Parameter an eine Memberfunktion einer Klasse übergeben. Dieser Code funktioniert mal:
... ( "open(" >> real_p[bind(&self_t::open, this, _1)] >> ");" >> "commit();" ) ...Aber wie schaffe ich es hier jetzt ZWEI Parameter anzugeben? Also die open-Funktion des geparsten Textes soll noch einen zweiten Parameter haben, ich habe es so in etwas versucht, hat aber nicht geklappt...
... ( "open(" >> real_p >>"," >> real_p[bind(&self_t::open, this, _1, _2)] >> ");" >> "commit();" ) ...Kann mir hier jemand weiterhelfen?
-
Reinoslav1 schrieb:
Aber wie schaffe ich es hier jetzt ZWEI Parameter anzugeben? Also die open-Funktion des geparsten Textes soll noch einen zweiten Parameter haben, ich habe es so in etwas versucht, hat aber nicht geklappt...
... ( "open(" >> real_p >>"," >> real_p[bind(&self_t::open, this, _1, _2)] >> ");" >> "commit();" ) ...Was erwartest du denn als zweiten Parameter? Der erste ist ja die Zahl, die real_p gelesen hat. Aber wo soll da ein zweiter Wert herkommen?
-
Das ist schon richtig so. Mit boost::bind kann man eben auch Parameter verwerfen.
-
Ben04 schrieb:
Das ist schon richtig so. Mit boost::bind kann man eben auch Parameter verwerfen.
Vielleicht stehe ich gerade einfach total auf dem Schlauch, aber hier wird doch kein Parameter verworfen, sondern "dazuerfunden", oder?
Die Semantic Action zu real_p muß ein Funktionsobjekt mit einem Parameter sein. Wenn die gebundene Funktion tatsächlich zwei Parameter hat, dann kann der zweite (bzw. einer davon) doch nur eine Konstante o.ä. sein, aber kein Platzhalter wie _2.
-
dooooomi schrieb:
Reinoslav1 schrieb:
Aber wie schaffe ich es hier jetzt ZWEI Parameter anzugeben? Also die open-Funktion des geparsten Textes soll noch einen zweiten Parameter haben, ich habe es so in etwas versucht, hat aber nicht geklappt...
... ( "open(" >> real_p >>"," >> real_p[bind(&self_t::open, this, _1, _2)] >> ");" >> "commit();" ) ...Was erwartest du denn als zweiten Parameter? Der erste ist ja die Zahl, die real_p gelesen hat. Aber wo soll da ein zweiter Wert herkommen?
Wie schon gesagt, ich habe es nur so geschrieben, weil ich keine Ahnung habe wie ich hier den zweiten Parameter binden könnte! Wie sollte das mit dem zweiten Parameter sonst funktionieren? Mit einem zweiten bind?
-
Reinoslav1 schrieb:
Wie schon gesagt, ich habe es nur so geschrieben, weil ich keine Ahnung habe wie ich hier den zweiten Parameter binden könnte! Wie sollte das mit dem zweiten Parameter sonst funktionieren? Mit einem zweiten bind?
Eben da wäre die Frage, was du gerne als zweiten Parameter hättest. Möglich ist es z.B., Literale anzugeben:
bind(&self_t::open, this, _1, 42)Du kannst aber auch beispielsweise Referenzen auf Variablen benutzen:
int x; ... bind(&self_t::open, this, _1, ref(x))
-
Ich habe z.B. folgenden Text zu parsen:
open(1,2);commit();
Diesen möchte ich mit folgender Grammatik parsen:
... ( "open(" >> real_p >>"," >> real_p >> ");" >> "commit();" ) ...Das funktioniert auch. Jetzt habe ich eine Member-Funktion:
void open(double n1, double n2), welche ich an die Grammatik binden möchte. Also wenn ich "open(1,2);commit();" parse, dann soll n1 = 1 und n2 = 2 sein. Wie geht das?
-
Wieso funktioniert eigentlich folgende Code nicht?
... ( [b]([/b]"open(" >> real_p >>"," >> real_p >> ");"[b])[bind(&self_t::open, this, _1)][/b] >> "commit();" ) ...Also ich habe hier ein Klammer gesetzt und dann die semantic action, weil ich will, dass das bind erst aufgerufen wird, wenn der komplete open(x,x); befehl erfolgreich geparst wird...
-
Also eigentlich möchte ich im Endeffekt jetzt folgende Grammatik:
int i,j; ... ( ("open(" >> real_p[assign_a(i)] >> "," >> real_p[assign_a(j)] >> ");")[bind(&self_t::open, this, i, j)] >> "commit();" )Aber irgendwie funktioniert das gar nicht! Warum?
-
Reinoslav1 schrieb:
Also eigentlich möchte ich im Endeffekt jetzt folgende Grammatik:
int i,j; ... ( ("open(" >> real_p[assign_a(i)] >> "," >> real_p[assign_a(j)] >> ");")[bind(&self_t::open, this, i, j)] >> "commit();" )Aber irgendwie funktioniert das gar nicht! Warum?
Der Ansatz müßte soweit stimmen. Einen "direkteren" Weg, die open-Funktion mit den beiden Werten aufzurufen, gibt es meines Wissens nicht.
So wie es da jetzt steht, wird die Funktion aber mit den Werten von i und j aufgerufen, die diese zum Zeitpunkt des bind-Aufrufs haben. Was du brauchst sind also nicht die Werte der Variablen, sondern Referenzen darauf. In etwa so müßte das gehen:
bind(&self_t::open, this, boost::ref(i), boost::ref(j))Ach ja, noch was: wenn du die Werte sowieso als Integers speicherst, wäre es dann nicht sinnvoller, int_p anstelle von real_p zu benutzen?