<?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[Metaprogrammierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>in welchen Fällen greift ihr zur Metaprogrammierung?<br />
Habt ihr bestimmte Situationen, wo ihr sie ausschließlich oder einfach<br />
nur gerne verwendet?</p>
<p>Metaprogger</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271577/metaprogrammierung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 07:14:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271577.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 31 Jul 2010 02:58:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 02:58:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in welchen Fällen greift ihr zur Metaprogrammierung?<br />
Habt ihr bestimmte Situationen, wo ihr sie ausschließlich oder einfach<br />
nur gerne verwendet?</p>
<p>Metaprogger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934284</guid><dc:creator><![CDATA[Metanprogger]]></dc:creator><pubDate>Sat, 31 Jul 2010 02:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 09:17:52 GMT]]></title><description><![CDATA[<p>Metanprogger schrieb:</p>
<blockquote>
<p>Hallo,<br />
in welchen Fällen greift ihr zur Metaprogrammierung?<br />
Habt ihr bestimmte Situationen, wo ihr sie ausschließlich oder einfach<br />
nur gerne verwendet?<br />
Metaprogger</p>
</blockquote>
<p>Läßt sich so allgemein nicht sagen. In welchen Fällen greifst Du zur Rekursion? In welchen Fällen greifst Du zu if?<br />
Ich meide Template-Metaprogrammiering wie goto oder switch auf Typen. Aber manchmal muß es eben sein. Oh, SFINAE klopft mir gerade auf die Schulter und sagt, ich soll heute oder morgen ein wenig mit der Meta kuscheln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934317</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 31 Jul 2010 09:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 11:48:41 GMT]]></title><description><![CDATA[<p>Ich erweitere mal die Frage auf:</p>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934357</guid><dc:creator><![CDATA[umsteller]]></dc:creator><pubDate>Sat, 31 Jul 2010 11:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 11:57:14 GMT]]></title><description><![CDATA[<p>umsteller schrieb:</p>
<blockquote>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
</blockquote>
<p>Hauptsächlich <a href="http://www.drakon.ch/?id=&amp;offset=2&amp;mobile=0&amp;show_entry=94" rel="nofollow">spielereien</a>. IIRC habe ich das nie in einem Projekt wirklich gebraucht. In gewissen Boost Bibliotheken wird es sehr ausgedehnt gebraucht, aber üblicherweise ist es nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934361</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 31 Jul 2010 11:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 12:01:13 GMT]]></title><description><![CDATA[<p>umsteller schrieb:</p>
<blockquote>
<p>Ich erweitere mal die Frage auf:</p>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
</blockquote>
<p>Zur automatischen Codegenerierung um ein Programm mit statischer Polymorphie zu erstellen, bei dem zwar die Algorithmen alle zur Programmierzeit bekannt waren, die Art und Anzahl der beteiligten Klassen aber erst zur Compilezeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934363</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 31 Jul 2010 12:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 17:09:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>umsteller schrieb:</p>
<blockquote>
<p>Ich erweitere mal die Frage auf:</p>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
</blockquote>
<p>Zur automatischen Codegenerierung um ein Programm mit statischer Polymorphie zu erstellen, bei dem zwar die Algorithmen alle zur Programmierzeit bekannt waren, die Art und Anzahl der beteiligten Klassen aber erst zur Compilezeit.</p>
</blockquote>
<p>Sehr schönes Beispiel<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934489</guid><dc:creator><![CDATA[Metanprogger]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 17:14:54 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>umsteller schrieb:</p>
<blockquote>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
</blockquote>
<p>Hauptsächlich <a href="http://www.drakon.ch/?id=&amp;offset=2&amp;mobile=0&amp;show_entry=94" rel="nofollow">spielereien</a>. IIRC habe ich das nie in einem Projekt wirklich gebraucht. In gewissen Boost Bibliotheken wird es sehr ausgedehnt gebraucht, aber üblicherweise ist es nicht nötig.</p>
</blockquote>
<p>Ah... Du bist 1989 Baujahr? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934492</guid><dc:creator><![CDATA[Metanprogger]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:14:54 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 21:43:13 GMT]]></title><description><![CDATA[<p>Immer, wenn ich mit Traits zu tun habe. Das ist im Zusammenhang mit Iteratoren häufiger der Fall - oft kann man mit Random-Access-Iteratoren auf eine effizientere Funktion ausweichen, als es mit einem einfachen Input-Iterator der Fall ist.</p>
<p>Ich habe beispielsweise vor einer Weile einen Container geschrieben, der eine Random-Access-Sequence modelliert (etwa wie std::vector), seine Daten aber bis zu einer per Template-Parameter einstellbaren Größe lokal hält und danach auf den Heap ausweicht (der Sinn der Sache war, seltener an den Heap gehen zu müssen und so Heap-Contention zu vermeiden). Kriege ich im Range-Konstruktor einen Random-Access-Iterator, kann ich die Datenmenge vorher feststellen und ggf. gleich auf den Heap ausweichen (und da genug Speicher auf einmal anfordern), kriege ich etwa eine std::istream_iterator, geht das nicht. Also:</p>
<pre><code class="language-cpp">template&lt;typename iter_t&gt; local_vector(iter_t b, iter_t e) {
  fill(b, e, typename std::iterator_traits&lt;iter_t&gt;::iterator_category());
}

// ...

template&lt;typename iter_t, typename iterator_category&gt;
void fill(iter_t b, iter_t e, iterator_category) {
  // Füllen wie aus einfachem Input-Iterator
}

template&lt;typename iter_t&gt;
void fill(iter_t b, iter_t e, std::random_access_iterator_tag) {
  // Füllen wie aus Random-Access-Iterator
}
</code></pre>
<p>Im eigentlichen Code ist das ganze noch etwas komplexer, weil ich das im Fall eines local_vector&lt;int, size&gt; o.ä. vom Füllkonstruktor (local_vector&lt;int, size&gt; lv(20, 1); ) trennen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934551</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 31 Jul 2010 21:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sat, 31 Jul 2010 23:46:43 GMT]]></title><description><![CDATA[<p>Metanprogger schrieb:</p>
<blockquote>
<p>in welchen Fällen greift ihr zur Metaprogrammierung?<br />
Habt ihr bestimmte Situationen, wo ihr sie ausschließlich oder einfach<br />
nur gerne verwendet?</p>
</blockquote>
<p>Ja, ab und zu passt es sehr gut. Was mir gerade einfällt:</p>
<ul>
<li>Type Traits</li>
<li>Static Assertions</li>
<li>Policy-Based Design</li>
</ul>
<p>Und natürlich statische Polymorphie als allgemeine Template-Programmierung. Kommt halt etwas drauf an, wo man die Grenze zur Metaprogrammierung zieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934589</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 31 Jul 2010 23:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 04:35:47 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Und natürlich statische Polymorphie als allgemeine Template-Programmierung. Kommt halt etwas drauf an, wo man die Grenze zur Metaprogrammierung zieht.</p>
</blockquote>
<p>Also das ist doch keine Metaprogrammierung mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934606</guid><dc:creator><![CDATA[humanspace]]></dc:creator><pubDate>Sun, 01 Aug 2010 04:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 09:21:46 GMT]]></title><description><![CDATA[<p>humanspace schrieb:</p>
<blockquote>
<p>Also das ist doch keine Metaprogrammierung mehr.</p>
</blockquote>
<p>Hätte ich jetzt auch gesagt, aber wo genau ist die Grenze? Das ist meiner Meinung nach nicht ganz eindeutig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934637</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Aug 2010 09:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 09:37:52 GMT]]></title><description><![CDATA[<p>Metanprogger schrieb:</p>
<blockquote>
<p>Ah... Du bist 1989 Baujahr? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Exakt. <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>
<p>Ich habe die Grenze sehr weit oben angesetzt und darum das Beispiel gepostet, wo ich wirklich eine Berechnung auslagere. Natürlich benutze ich die Sachen, die Nexus anspricht ebenfalls, aber bis vielleicht auf die static Assertions gehört für mich das zu normaler Benutzung von templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934641</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 01 Aug 2010 09:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 09:46:47 GMT]]></title><description><![CDATA[<p>Template-Metaprogrammierung ist, wenn die Fehlermeldung länger als fünf Zeilen ist.</p>
<p>Aber Spaß beiseite, so, wie manchmal über Metaprogrammierung gesprochen wird, hat man den Eindruck, Metaprogrammierung sei, was derart abgedreht ist, dass es kein Normalsterblicher jemals verstehen könne (geschweige denn benutzen wolle). Für mein Verständnis dagegen bedeutet Metaprogrammierung, Teile der Programmlogik auf den Compiler abzuwälzen. Eine wirklich klare Grenze wird sich aber wohl kaum definieren lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934644</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 01 Aug 2010 09:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 14:26:02 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich habe die Grenze sehr weit oben angesetzt und darum das Beispiel gepostet, wo ich wirklich eine Berechnung auslagere.</p>
</blockquote>
<p>Naja, solche Experimente werden ja oft als Beispiele genannt, ebenso wie die Potenzberechnung in Wikipedia. Meiner Ansicht nach gehört das aber genau zu jenen Fällen, die man in der Praxis nie verwendet. Vielleicht besteht die gewisse Skepsis oder Ablehnung gegenüber Template-Metaprogrammierung in C++ zumindest zu einem Teil, weil eine falsche Vorstellung vorherrscht (wie von seldon erwähnt).</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Natürlich benutze ich die Sachen, die Nexus anspricht ebenfalls, aber bis vielleicht auf die static Assertions gehört für mich das zu normaler Benutzung von templates.</p>
</blockquote>
<p>Ich verstehe nicht, wieso Static-Assertions für dich eher dazugehören als Type Traits. Die Technik dahinter ist genau die gleiche (Typ/Konstanten-Dispatching anhand von Templatespezialisierung).</p>
<p>Was hier übrigens noch keiner erwähnt hat, ist Präprozessor-Metaprogrammierung. Das braucht man zwar eher selten, aber für gewisse Fälle sind Makros gute Codegeneratoren. Boost hat ja eine eigene Bibliothek dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934751</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 14:44:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was hier übrigens noch keiner erwähnt hat, ist Präprozessor-Metaprogrammierung. Das braucht man zwar eher selten, aber für gewisse Fälle sind Makros gute Codegeneratoren. Boost hat ja eine eigene Bibliothek dafür.</p>
</blockquote>
<p>Ich sollte noch dabei sagen, dass mein oben erwähnter Codegenerator komplett im Präprozessor programmiert wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> . Und ohne die genannte Boost-Bibliothek wäre das viel Arbeit gewesen, mit war es relativ einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934758</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 14:49:33 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Für mein Verständnis dagegen bedeutet Metaprogrammierung, Teile der Programmlogik auf den Compiler abzuwälzen. Eine wirklich klare Grenze wird sich aber wohl kaum definieren lassen.</p>
</blockquote>
<p>Aber nicht</p>
<pre><code class="language-cpp">int berechne(int x)
{
   int const vollversion=false;
   if(vollversion)
      return foo(17*x);
   else
      return bar(19*x);
}
</code></pre>
<p>und das Abwälzen sieht so aus, daß man weiß, daß der Compiler den Zeigr mit der always-false-condition gar nicht erzeugt.</p>
<p>Und auch nicht</p>
<pre><code class="language-cpp">int const size=4096/sizeof(Foo);//ganze Speicherseite auf einmal holen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1934762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934762</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 01 Aug 2010 14:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Sun, 01 Aug 2010 15:06:31 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Ich habe die Grenze sehr weit oben angesetzt und darum das Beispiel gepostet, wo ich wirklich eine Berechnung auslagere.</p>
</blockquote>
<p>Naja, solche Experimente werden ja oft als Beispiele genannt, ebenso wie die Potenzberechnung in Wikipedia. Meiner Ansicht nach gehört das aber genau zu jenen Fällen, die man in der Praxis nie verwendet. Vielleicht besteht die gewisse Skepsis oder Ablehnung gegenüber Template-Metaprogrammierung in C++ zumindest zu einem Teil, weil eine falsche Vorstellung vorherrscht (wie von seldon erwähnt).</p>
</blockquote>
<p>Ich sagte, dass das eher Spielerei ist, um zu zeigen, was man damit machen kann. Template-Metaprogrammierung ist da halt eher, dass man das eigentliche Programm wirklich auslagert und den Compiler nicht nur als Hilfsmittel benutzt. Man schiebt die eigentliche Logik komplett auf den Compiler und benutzt die Sprache lediglich als Hilfsmittel, um das Ergebnis anzuzeigen. Auf der Stufe ist es natürlich (noch) nicht wirklich zu gebrauchen, aber ich könnte mir gut vorstellen, dass mit der Zeit der Aspekt vielleicht doch ein wenig an Stärke gewinnt.</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Natürlich benutze ich die Sachen, die Nexus anspricht ebenfalls, aber bis vielleicht auf die static Assertions gehört für mich das zu normaler Benutzung von templates.</p>
</blockquote>
<p>Ich verstehe nicht, wieso Static-Assertions für dich eher dazugehören als Type Traits. Die Technik dahinter ist genau die gleiche (Typ/Konstanten-Dispatching anhand von Templatespezialisierung).</p>
</blockquote>
<p>Weil ich nie wirklich den Drang hatte es die benutzen zu müssen, wogegen Traits doch immer mal wieder sehr nett sind. Daher gehört es für mich eher auf die Seite der spielereien.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934769</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 01 Aug 2010 15:06:31 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Mon, 02 Aug 2010 07:35:23 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>und das Abwälzen sieht so aus, daß man weiß, daß der Compiler den Zeigr mit der always-false-condition gar nicht erzeugt.</p>
</blockquote>
<p>Trotzdem muss der Code in diesem Zweig noch kompilierbar sein. Diese Einschränkung hast du mit Template-Spezialisierungen, die den Ablaufpfad bestimmen, nicht (was oft ein Grund ist, diese einzusetzen). Wobei bei deinem ersten Beispiel wohl bedingte Kompilierung über <code>#ifdef</code> am geeignetsten wäre.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Weil ich nie wirklich den Drang hatte es die benutzen zu müssen, wogegen Traits doch immer mal wieder sehr nett sind. Daher gehört es für mich eher auf die Seite der spielereien.</p>
</blockquote>
<p>Traits können ja auch nett <em>und</em> Metaprogrammierung sein. Oder impliziert der Begriff Metaprogrammierung für dich, dass es sich um Spielereien handelt? <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/1934973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934973</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 02 Aug 2010 07:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Mon, 02 Aug 2010 13:35:13 GMT]]></title><description><![CDATA[<p>wenn ich in meinem aktuellen Projekt nach 'boost/mpl' suche, ist das Ergebnis recht dünn. Aber zumindest einen konkreten und auch sinnvollen Anwendungsbereich gibt es:</p>
<p>wir haben ein kleine Lib, mit der wir Variablen aus einer (xml-)Konfigdatei lesen. Da wir typsicher lesen wollen, läuft das intern auf einen lexical_cast hinaus. Nun ist es bei einigen Werten so, dass rudimentäre Werte (char, int oder double) gelesen werden sollen, aber diese in einem anderen Format in der xml-Datei stehen.</p>
<p>Im konkreten Fall bedeutet das, dass im Programm ein double (für die Länge in Metern) genutzt wird und in der Datei &quot;21.5cm&quot; steht - der gewünschte Wert für den double wäre also 0.215. Dafür haben wir auch Manipulatoren (z.B. Meters), die das machen würden, aber man kann normalerweise nicht schreiben:</p>
<pre><code class="language-cpp">double lenInMetern = lexical_cast&lt; Meters &gt;( config[&quot;Laenge&quot;] );
</code></pre>
<p>das habe ich per Metaprogprammierung so gelöst, dass an den Code-Stellen wo gelesen wird, eine Eigenschaft des Templateparameters abgefragt wird und dann eben der Manipulator (hier Meters) genutzt wird und der Rückgabewert ist dann 'Meters::value_type == double' statt 'Meters'. Somit funktioniert der Code wie er oben steht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935160</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 02 Aug 2010 13:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Mon, 02 Aug 2010 17:26:52 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Weil ich nie wirklich den Drang hatte es die benutzen zu müssen, wogegen Traits doch immer mal wieder sehr nett sind. Daher gehört es für mich eher auf die Seite der spielereien.</p>
</blockquote>
<p>Traits können ja auch nett <em>und</em> Metaprogrammierung sein. Oder impliziert der Begriff Metaprogrammierung für dich, dass es sich um Spielereien handelt? <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>
</blockquote>
<p>Mit der relativ hohen Grenze, welche ich benutzt habe ja. Wie gesagt für mich (!) ist das Metaprogrammierung, wenn man wirklich Programmlogik auslagert. Da die Grenzen ja nicht definiert sind kann man das natürlich anders sehen, aber so etwas, wie Werner anspricht ist für mich nicht wirklich Metaprogrammierung (ohne den Code gesehen zu haben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935278</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 02 Aug 2010 17:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Mon, 02 Aug 2010 18:13:01 GMT]]></title><description><![CDATA[<p>Boost Spirit ist meta-programmiert. Du gibst in Source Code eine EBNF-ähnliche Form ein und daraus wird ein Parser zur Compilerzeit gebaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935297</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 02 Aug 2010 18:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Mon, 02 Aug 2010 19:06:18 GMT]]></title><description><![CDATA[<p>Ein sehr schoenes Beispiel ist z.B. Typsicherheit bei physikalischen Berechnungen wie sie in Boost's MPL angegeben ist. D.h. wenn ich eine Kraft mit einem Weg vergleiche, dann soll schon der Compiler den Fehler feststellen.</p>
<p>Boost's Spirit halte ich dagegen nicht so toll. Es gibt Parser wie Sand am mehr, die sich ebenfalls gut in C oder C++ einbinden lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935314</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 02 Aug 2010 19:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung on Tue, 03 Aug 2010 06:43:55 GMT]]></title><description><![CDATA[<p>umsteller schrieb:</p>
<blockquote>
<p>Ich erweitere mal die Frage auf:</p>
<p>In welchen Situationen habt ihr schon Metaprogrammierung verwendet?</p>
</blockquote>
<p>Für enum-Typ mapping. In einem Programm hatte ich ein kleines Protokoll mit Befehlen, die durch ein Enum codiert waren. Je nach Befehl wurden zusätzliche Daten benötigt, die völlig unterschiedliche Typen haben konnten. Das Ganze ging dann in etwa so:</p>
<pre><code class="language-cpp">enum ECommand { /* ... */ };

struct Command
{
  ECommand ec;
  virtual ~Command() {}
};

struct Empty_t {};

template &lt;ECommand EC&gt;
struct Ec2Type
{
  typedef Empty_t type;
};
//partial specalizations of Ec2Type...

template &lt;ECommand EC&gt;
struct ParametrizedCommand : public Command
{
  typename Ec2Type&lt;EC&gt;::type param;
};
</code></pre>
<p>Die ParametrizedCommand's wurden dann per shared_ptr&lt;Command&gt; durch die Gegend gereicht, es gab dazu noch eine create- und eine extract-Funktion, die die Commands mit Parametern erstellt haben bzw. die Parameterwerte daraus extrahiert haben.<br />
Vermutlich wäre es auch einfacher gegangen, aber ich spiele halt gerne mit TMP rum <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>
<p>knivil schrieb:</p>
<blockquote>
<p>Boost's Spirit halte ich dagegen nicht so toll. Es gibt Parser wie Sand am mehr, die sich ebenfalls gut in C oder C++ einbinden lassen.</p>
</blockquote>
<p>Und selbst wenns noch Meer Parser gäbe, wäre das kein Argument dass Spirit schlecht ist <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="😉"
    /> Ich weiß nicht wie gut sich Spirit in produktivem COde einsetzen lässt, aber schon das Konzept ist eines der besten Beispiele wie viel erstaunliche Dinge man erreichen kann wenn man die verschiedenen Paradigmen von C++ richtig kombiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935440</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 03 Aug 2010 06:43:55 GMT</pubDate></item></channel></rss>