<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben]]></title><description><![CDATA[<p>folgendes Szenario: Ich habe eine Klasse, die über einen (sehr) langen Stream von Daten läuft. Bei jedem Schritt wird ein Haufen Membervariablen der Klasse mit Daten aus dem Stream gefüllt und in Abhängigkeit dieser Variablen werden einige verschiedene Aktionen ausgeführt. Ich habe überlegt, ob es eventuell möglich wäre, Objekte zu erstellen, die einen bestimmten Ausdruck präsentieren, Referenzen auf einige Variablen haben und bei Bedarf mit dem aktuellen Wert der Variablen ausgewertet werden können, beispielsweise</p>
<pre><code class="language-cpp">class Foo;
class Bar;
Foo operator% (double, Foo);
Bar operator+ (Foo, int);

struct Holder {
  int a;
  double b;
  Foo c;
};

int main() {
  Holder h;
  ExpressionObject exp(&quot;(h.c % h.a) + h.b &quot;, h.c, h.a, h.b);
  /* mach was mit bar ...*/ 

  Bar bar = exp.evaluate(); //ergibt den aktuellen Wert von (h.c % h.a) + h.b
  /*...*/
  Bar bar2 = exp.evaluate(); //ergibt den aktuellen Wert von (h.c % h.a) + h.b
}
</code></pre>
<p>Gibt es schon Dinge, die in die Richtung gehen? Man könnte sicherlich für jeden Ausdruck von Hand ein Funktionsobjekt schreiben, das wollte ich mir aber sparen (es wären einige hundert) und trotzdem Objekte wie im Beispiel haben, um sie in der Applikation herumzureichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206084/ausdrücke-zur-laufzeit-berechnen-und-als-objekte-weitergeben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 07:03:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206084.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Feb 2008 06:48:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 06:48:29 GMT]]></title><description><![CDATA[<p>folgendes Szenario: Ich habe eine Klasse, die über einen (sehr) langen Stream von Daten läuft. Bei jedem Schritt wird ein Haufen Membervariablen der Klasse mit Daten aus dem Stream gefüllt und in Abhängigkeit dieser Variablen werden einige verschiedene Aktionen ausgeführt. Ich habe überlegt, ob es eventuell möglich wäre, Objekte zu erstellen, die einen bestimmten Ausdruck präsentieren, Referenzen auf einige Variablen haben und bei Bedarf mit dem aktuellen Wert der Variablen ausgewertet werden können, beispielsweise</p>
<pre><code class="language-cpp">class Foo;
class Bar;
Foo operator% (double, Foo);
Bar operator+ (Foo, int);

struct Holder {
  int a;
  double b;
  Foo c;
};

int main() {
  Holder h;
  ExpressionObject exp(&quot;(h.c % h.a) + h.b &quot;, h.c, h.a, h.b);
  /* mach was mit bar ...*/ 

  Bar bar = exp.evaluate(); //ergibt den aktuellen Wert von (h.c % h.a) + h.b
  /*...*/
  Bar bar2 = exp.evaluate(); //ergibt den aktuellen Wert von (h.c % h.a) + h.b
}
</code></pre>
<p>Gibt es schon Dinge, die in die Richtung gehen? Man könnte sicherlich für jeden Ausdruck von Hand ein Funktionsobjekt schreiben, das wollte ich mir aber sparen (es wären einige hundert) und trotzdem Objekte wie im Beispiel haben, um sie in der Applikation herumzureichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459915</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 21 Feb 2008 06:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 07:41:05 GMT]]></title><description><![CDATA[<p>Du hast dabei ja schon das Problem das das Programm zur Laufzeit gar nicht weiß das Holder die Membervariablen a, b und c hat. Wenn würde das wohl eher im Stile von printf funktionieren. Also mit Platzhaltern die die Argumente referenzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459928</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 21 Feb 2008 07:41:05 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 07:54:32 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Du hast dabei ja schon das Problem das das Programm zur Laufzeit gar nicht weiß das Holder die Membervariablen a, b und c hat.</p>
</blockquote>
<p>Braucht es auch nicht wissen, wenn exp Referenzen auf die Variablen behaelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459930</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 21 Feb 2008 07:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 07:58:28 GMT]]></title><description><![CDATA[<p>Was ich meine ist das aus dem String &quot;(h.c % h.a) + h.b &quot; kein Rückschluss auf die angehängten Variablen gegeben werden kann. Eher wäre da sowas sinnvoll wie:<br />
... exp(&quot;($1 % $2) + $3 &quot;, h.c, h.a, h.b);</p>
<p>Weil zwischen &quot;h.c&quot; und h.c besteht nur zur Kompilierzeit ein Zusammenhang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459933</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 21 Feb 2008 07:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 10:22:37 GMT]]></title><description><![CDATA[<p>klar, dass das so mit dem String nicht ganz funktioniert ist mir bewusst. Ich hab mir schon einige Gedanken gemacht,dass man das evtl mit Templates regeln koennte:</p>
<pre><code class="language-cpp">template&lt;typename Result, typename Left, typename Right&gt;
class add_expr {
  Left const&amp; l;
  Right const&amp; r;
public:
  typedef Result result_t;

  add(Left const&amp; l, Right const&amp; r) : l(l), r(r) {}
  result_t eval() { return l+r; }
};

template &lt;typename Result, typename Left, typename Right&gt;
add_expr&lt;Result, Left, Right&gt; add(Left const&amp; l, Right const&amp; r)
  { return add_expr(l,r); }
</code></pre>
<p>int main() {<br />
int i;<br />
double d;<br />
add_expr&lt;int, int, double&gt; e = add&lt;int&gt;(i,d);<br />
}[/cpp]</p>
<p>Das ist nur ein Anfang, um kompliziertere Ausdruecke zusammenzubauen muss das Funktionstemplate unterscheiden, ob einer der Parameter eine Variable oder ein anderer Ausdruck ist, entsprechend muessen die zurueckgegebenen Typen unterschiedlich sein, um das richtige Auswerten des Ausdrucks zu managen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460042</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 21 Feb 2008 10:22:37 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 10:44:51 GMT]]></title><description><![CDATA[<p>Grundsätzlich möglich ist sowas auch mit Mitteln der Standardbibliothek (TR1). Die Probleme sind die gleichen wie bei Deiner Lösung, aber vielleicht hilft die Idee in irgendeiner Weise weiter. Evtl. kann man das ganze so auf Helperfunktionen beschränken und die Klasse *_expr einsparen.</p>
<pre><code class="language-cpp">int a, b;
std::tr1::function&lt; int () &gt; f = std::tr1::bind( std::plus&lt; int &gt;(), std::tr1::ref(a), std::tr1::ref(b) );

a = 1; b = 1;
std::cout &lt;&lt; f() &lt;&lt; std::endl;

a = 12; b = 3;
std::cout &lt;&lt; f() &lt;&lt; std::endl;

return f;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1460068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460068</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 21 Feb 2008 10:44:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 13:29:38 GMT]]></title><description><![CDATA[<p>muss ich mir mal anschauen wie weit ich damit kommen kann, z.B. ob ich damit auch gemischte Operatoren wie die beiden in meinem ersten Beispiel hinbekomme. Ich hatte schon wilde Phantasien, wie man massive Operatorueberladungen frei nach boost::spirit implementieren kann um etwa sowas wie das Folgende hinzubekommen:</p>
<pre><code class="language-cpp">bool ask();

int main() {
int a, b, c;
double d, e, f;

Expression&lt;bool&gt; e = ((expr(a) &lt; b) &amp;&amp; (expr(d) != e)) || (expr(c) &lt; f) &amp;&amp; !fun_expr(&amp;ask)); 

/*...*/
bool b = e();
}
</code></pre>
<p>Der Typ auf der rechten Seite des Gleicheitszeichens waere dann in etwa ein<br />
logic_and&lt;logic_or&lt;logic_and&lt;less_expression&lt;int,int&gt;,uneq_expression&lt;double, double&gt; &gt;,less_expression&lt;int,double&gt; &gt;,logic_not&lt;fun_expression&lt;bool (*)()&gt; &gt; &gt;<br />
Die Funktionen, um sowas zusammenzubauen sollten relativ einfach machbar sein, wenn man den Ueberblick behaelt und fleissig tippt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460194</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 21 Feb 2008 13:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ausdrücke zur Laufzeit berechnen und als Objekte weitergeben on Thu, 21 Feb 2008 14:14:40 GMT]]></title><description><![CDATA[<p>Hallo Pumuckl,</p>
<p>da spricht nichts gegen. Das ist sogar durchaus üblich, auf diese Weise Ausdrucksbäume zu generieren. Ich habe gerade gestern aus reinem Jux einen kleinen Ausdrucksauswerter für Bool-Ausdrücke geschrieben, der genau das macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460243</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 21 Feb 2008 14:14:40 GMT</pubDate></item></channel></rss>