<?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[wie würde so etwas in C++ aussehen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein kleines Beispielprogramm in Scala geschrieben. Ich benutzte Pattern matching mit Decomposition.</p>
<p><a href="http://pastebin.com/U6acbMKF" rel="nofollow">http://pastebin.com/U6acbMKF</a></p>
<p>Ich denke es sollte eigentlich recht klar sein was in dem Programm passiert. Man kann Expressions definieren und diese verbinden. Man hat eine toString Method die die Expression in ein lesbares Format umwandelt und eine eval Method die das Ergebnis berechnet.</p>
<p>(Comments = Output)</p>
<p>Wäre so etwas in C++ viel mehr Arbeit? Kann man solche Probleme auch elegant in C++ lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308976/wie-würde-so-etwas-in-c-aussehen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 13:02:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308976.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Oct 2012 22:48:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Wed, 10 Oct 2012 22:48:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein kleines Beispielprogramm in Scala geschrieben. Ich benutzte Pattern matching mit Decomposition.</p>
<p><a href="http://pastebin.com/U6acbMKF" rel="nofollow">http://pastebin.com/U6acbMKF</a></p>
<p>Ich denke es sollte eigentlich recht klar sein was in dem Programm passiert. Man kann Expressions definieren und diese verbinden. Man hat eine toString Method die die Expression in ein lesbares Format umwandelt und eine eval Method die das Ergebnis berechnet.</p>
<p>(Comments = Output)</p>
<p>Wäre so etwas in C++ viel mehr Arbeit? Kann man solche Probleme auch elegant in C++ lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259034</guid><dc:creator><![CDATA[kantaki]]></dc:creator><pubDate>Wed, 10 Oct 2012 22:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Wed, 10 Oct 2012 23:45:11 GMT]]></title><description><![CDATA[<p>kantaki schrieb:</p>
<blockquote>
<p>Wäre so etwas in C++ viel mehr Arbeit? Kann man solche Probleme auch elegant in C++ lösen?</p>
</blockquote>
<p>Du wolltest es so ...</p>
<pre><code class="language-cpp">#define MAKE_OPERATOR(name, op)                                         \
  template &lt;typename Lhs, typename Rhs&gt;                                 \
  struct name##_ {                                                      \
    Lhs lhs; Rhs rhs;                                                   \
    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, name##_ const&amp; n) \
    { return os &lt;&lt; '(' &lt;&lt; n.lhs &lt;&lt; #op &lt;&lt; n.rhs &lt;&lt; ')'; }               \
    friend auto eval(name##_ const&amp; n) -&gt; decltype(eval(n.lhs) op eval(n.rhs)) \
    { return eval(n.lhs) op eval(n.rhs); }                              \
  };                                                                    \
  template &lt;typename Lhs, typename Rhs, typename Res=name##_&lt;Lhs,Rhs&gt; &gt; \
  Res name(Lhs const&amp; lhs, Rhs const&amp; rhs) { return Res{lhs, rhs}; }

double eval(double d) { return d; }
MAKE_OPERATOR(prod, *)
MAKE_OPERATOR(sum,  +)
MAKE_OPERATOR(div,  /)

int main()
{
  auto a = prod(sum(sum(2, 3), 1), 5);
  std::cout &lt;&lt; a &lt;&lt; &quot; = &quot; &lt;&lt; eval(a) &lt;&lt; '\n';

  auto b = div(sum(28, 2), prod(5, 2));
  std::cout &lt;&lt; b &lt;&lt; &quot; = &quot; &lt;&lt; eval(b) &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/uJvE2" rel="nofollow">http://ideone.com/uJvE2</a></p>
<p>Und jetzt noch der Vergleich zur Scala-Variante:</p>
<ul>
<li>Ein neuer Operator wird genau an einer Stelle definiert, bei dir sind es 3 Stellen.</li>
<li>Dein &quot;Pattern matching mit Decomposition&quot; nennt man in C++ switch-case und ist da zu Recht schlechter Stil. Ich liebe Pattern Matching, wenn es richtig benutzt wird, aber du wendest es in deinem Beispiel am falschen Ort an.</li>
<li>Mein Design lässt sich einfach erweitern. Z.B. wird für eine Unterstützung von <code>std::complex</code> nur eine Zeile benötigt. Und bei dir?</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2259037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259037</guid><dc:creator><![CDATA[trollfeder]]></dc:creator><pubDate>Wed, 10 Oct 2012 23:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 00:18:38 GMT]]></title><description><![CDATA[<p>Sieht ziemlich elegant aus muss ich sagen. Merkwürdig, viele Behaupten C++ sei sehr verbose doch das sieht recht schön und kompakt aus. Obwohl ich doch den Scala code schöner finde, ist vielleicht aber auch Geschmackssache.</p>
<p>Wie sieht es denn aus wenn man komplexere Arithmetik benutzen möchte zb factorial? Wäre es immernoch einfach erweiterbar?</p>
<pre><code class="language-cpp">MAKE_OPERATOR(fac,  some_factorial )
</code></pre>
<p>Ja ich müsste in meinem Beispielprogramm 3 Zeilen hinzufügen class, case für show und case eval.</p>
<p>Es geht sicherlich auch noch schöner, bin noch ein Scala neuling.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259039</guid><dc:creator><![CDATA[kantaki]]></dc:creator><pubDate>Thu, 11 Oct 2012 00:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 00:25:14 GMT]]></title><description><![CDATA[<p>Factorial geht auch. Ist etwas komplizierter, weil es kein binärer sonder ein unärer Operator ist.</p>
<p>Sehr verbose formatiert sähe das so aus (vielleicht kann man es so etwas besser lesen):</p>
<pre><code class="language-cpp">long long fac(int n)
{
  return n &lt;= 0 ? 1 : n*fac(n-1);
}

template &lt;typename T&gt;
struct factorial_ {
  T val;

  friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, factorial_ const&amp; f)
  {
    return os &lt;&lt; '(' &lt;&lt; f.val &lt;&lt; &quot;)!&quot;;
  }

  friend long long eval(factorial_ const&amp; f)
  {
    return fac(static_cast&lt;int&gt;(eval(f.val)));
  }
};

template &lt;typename T&gt;
factorial_&lt;T&gt; factorial(T const&amp; val)
{
  return factorial_&lt;T&gt;{val};
}

// dann im main:
auto c = prod(1, sum(factorial(sum(2, 3)), 0));
std::cout &lt;&lt; c &lt;&lt; &quot; = &quot; &lt;&lt; eval(c) &lt;&lt; '\n';
// Ausgabe: (1*(((2+3))!+0)) = 120
</code></pre>
<p>Wichtig ist zu sehen, dass der übrige Teil des Programmes nicht verändert werden musste. Du müsstest an 3 Stellen etwas abändern und wenn du eine vergisst crasht das Programm. Wenn ich z.B. die eval-Funktion vergessen hätte gäbe es einen Compilerfehler.</p>
<p>Aber stimmt schon, es könnte auch in C++ etwas mehr dense sein. In dem im letzten Post definierten Makro sind 2 Workarounds drin für etwas, was eigentlich die Sprache selber können sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259041</guid><dc:creator><![CDATA[trollfeder]]></dc:creator><pubDate>Thu, 11 Oct 2012 00:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 00:50:17 GMT]]></title><description><![CDATA[<p>Ich habe gefragt weil ich mich jetzt auf eine Sprache spezialisieren möchte und ich war mir nicht sicher ob es C++ oder Scala werden sollte.</p>
<p>Ich muss sagen der C++ code sieht recht hübsch aus.</p>
<p>Ich bekomme auch einen Compiler error, es wird sogar in der IDE rot makiert, da nicht alle cases genutzt werden würden.</p>
<p>C++ ist defenitiv mehr verbreitet, jetzt muss ich mich nur noch entscheiden. Aber als Anfänger der nicht alle Features kennt ist das natürlich nicht gerade einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259042</guid><dc:creator><![CDATA[kantaki]]></dc:creator><pubDate>Thu, 11 Oct 2012 00:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 05:46:06 GMT]]></title><description><![CDATA[<p>kantaki schrieb:</p>
<blockquote>
<p>Aber als Anfänger der nicht alle Features kennt ist das natürlich nicht gerade einfach.</p>
</blockquote>
<p>Kleine Entscheidungshilfe: Wenn man C++ aus dem FF kennt und weiß, wie es &quot;unter der Haube&quot; funktioniert, dann ist der Einstieg in eine große Menge anderer Sprachen ein Klacks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259052</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 11 Oct 2012 05:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 07:27:55 GMT]]></title><description><![CDATA[<p>Ich lese jetzt öfters dass es hilft, zu wissen wie C++ unter der Haube so funktioniert. Gibt es da ein gutes Buch drüber, oder auch Webseiten die mal einen kleinen Einblick geben können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259074</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 11 Oct 2012 07:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 07:29:43 GMT]]></title><description><![CDATA[<p>Butterbrot schrieb:</p>
<blockquote>
<p>Gibt es da ein gutes Buch drüber</p>
</blockquote>
<p>Ja, gibt es.<br />
<a href="https://duckduckgo.com/?q=isbn+0201834545&amp;cppnetbooks" rel="nofollow">Inside the C++ Object Model | ISBN: 0201834545</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259078</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 11 Oct 2012 07:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 07:37:33 GMT]]></title><description><![CDATA[<p>kantaki schrieb:</p>
<blockquote>
<p>Ich denke es sollte eigentlich recht klar sein was in dem Programm passiert.</p>
</blockquote>
<p>Nein, fuer mich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259080</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 11 Oct 2012 07:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to wie würde so etwas in C++ aussehen? on Thu, 11 Oct 2012 13:43:01 GMT]]></title><description><![CDATA[<p>hier die scala version zum c++ programm</p>
<p><a href="http://pastebin.com/U39Z5UKG" rel="nofollow">http://pastebin.com/U39Z5UKG</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259230</guid><dc:creator><![CDATA[kantaki]]></dc:creator><pubDate>Thu, 11 Oct 2012 13:43:01 GMT</pubDate></item></channel></rss>