<?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[Schleifen mit bzw. in Templates realisieren]]></title><description><![CDATA[<p>Ich habe gerade mein Template zur Primzahlüberprüfung fertiggestellt. Es sieht ungefähr so aus:</p>
<pre><code class="language-cpp">template &lt;ulong Number&gt;
struct IsPrime
{
private:
	static const ulong divisors = NumberOfDivisors&lt;Number&gt;::value;

public:
	static const bool value = (divisors == 2);
};
</code></pre>
<p>Ich würde jetzt gerne alle Primzahlen bis 100 ausgeben oder ähnliches. Ich habe schon ein bisschen gegoogelt, aber nichts Konkretes gefunden.<br />
Ich dachte schon daran irgendwas in der Richtung PrintOutIf&lt;Number, Condition&gt; zu machen:</p>
<pre><code class="language-cpp">template &lt;ulong Number, bool Condition&gt;
struct PrintOutIf
{ 
private:
	template &lt;bool Condition&gt;
	struct Printer
	{ };

	template &lt;&gt;
	struct Printer&lt;true&gt;
	{
		Printer()
		{
			std::cout &lt;&lt; Number;
		}
	};

	Printer&lt;Condition&gt; printer;
};

// Damit geht dann sowas Tolles:
PrintOutIf &lt; 5, IsPrime&lt;5&gt;::value &gt; &gt;();
</code></pre>
<p>Klappt auch alles soweit. Aber bei der Umsetzung von Schleifen happerts noch ein bisschen. Bin für jeden Denkanstoß dankbar.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199092/schleifen-mit-bzw-in-templates-realisieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 12:17:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199092.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Nov 2007 20:31:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Wed, 28 Nov 2007 20:31:25 GMT]]></title><description><![CDATA[<p>Ich habe gerade mein Template zur Primzahlüberprüfung fertiggestellt. Es sieht ungefähr so aus:</p>
<pre><code class="language-cpp">template &lt;ulong Number&gt;
struct IsPrime
{
private:
	static const ulong divisors = NumberOfDivisors&lt;Number&gt;::value;

public:
	static const bool value = (divisors == 2);
};
</code></pre>
<p>Ich würde jetzt gerne alle Primzahlen bis 100 ausgeben oder ähnliches. Ich habe schon ein bisschen gegoogelt, aber nichts Konkretes gefunden.<br />
Ich dachte schon daran irgendwas in der Richtung PrintOutIf&lt;Number, Condition&gt; zu machen:</p>
<pre><code class="language-cpp">template &lt;ulong Number, bool Condition&gt;
struct PrintOutIf
{ 
private:
	template &lt;bool Condition&gt;
	struct Printer
	{ };

	template &lt;&gt;
	struct Printer&lt;true&gt;
	{
		Printer()
		{
			std::cout &lt;&lt; Number;
		}
	};

	Printer&lt;Condition&gt; printer;
};

// Damit geht dann sowas Tolles:
PrintOutIf &lt; 5, IsPrime&lt;5&gt;::value &gt; &gt;();
</code></pre>
<p>Klappt auch alles soweit. Aber bei der Umsetzung von Schleifen happerts noch ein bisschen. Bin für jeden Denkanstoß dankbar.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411867</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Wed, 28 Nov 2007 20:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Wed, 28 Nov 2007 20:38:54 GMT]]></title><description><![CDATA[<p>Bin mir nicht sicher aber so sollte es gehen:</p>
<pre><code class="language-cpp">for (ulong i = 0; i &lt; 100; ++i)
	{
		PrintOutIf&lt;i, IsPrime&lt;i&gt; &gt; ();
	}
</code></pre>
<p>Edit:<br />
Ist aber komisch, denn eigentlich werden die Templates ja zur Kompilezeit ausgewertet und die Schleife nicht... also ich weiss nicht so recht.. ???</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411870</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Wed, 28 Nov 2007 20:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Wed, 28 Nov 2007 20:44:37 GMT]]></title><description><![CDATA[<p>Also der MS-Kompiler sagt mir bei der Variante:</p>
<pre><code>error C2971: 'IsPrime': Vorlagenparameter 'Number': 'i': Eine lokale Variable kann nicht als Nichttyp-Argument verwendet werden
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1411873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411873</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Wed, 28 Nov 2007 20:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Wed, 28 Nov 2007 21:11:32 GMT]]></title><description><![CDATA[<p>Der Compiler hat recht (leider). Die üblichen Variablen scheiden als template-Parameter aus, da diese zur compilier-Zeit bekannt sein müssen (d.h. zur Laufzeit konstant sind). Damit helfen die üblichen Schleifen hier nicht weiter.</p>
<p>Aber Rekursion ist möglich:</p>
<pre><code class="language-cpp">template &lt;typename T, unsigned int i&gt;
struct Loop {
  enum { value = T&lt;i&gt;::value };
  enum { counter = Loop&lt;T, i-1&gt;::counter };
};

template &lt;typename T&gt;
struct Loop&lt;T, 0&gt; {
  enum { value = T&lt;0&gt;::value };
  enum { counter = 0 };
};
</code></pre>
<p>Mag sein, dass das jetzt nicht fehlerfrei ist, habs aus dem Gedächnis gekramt; aber das Prinzip sollte klar werden.</p>
<p>Übringens nicht zu große Zahlen verwenden; der Compiler kann bezüglich der Rekursionstiefe recht eingeschränkt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411887</guid><dc:creator><![CDATA[deha]]></dc:creator><pubDate>Wed, 28 Nov 2007 21:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Wed, 28 Nov 2007 23:26:07 GMT]]></title><description><![CDATA[<p>Äh.<br />
Was meinst du mit ausgeben? Mit so Template-Tricks kannst du nur Compile-Time Zeugs zusammenbasteln, wirklich ausgeben kannst du da nix. Du kannst höchstens eine Funktion basteln die eine bestimmte Range ausgibt, oder einen boost::mpl::vector zusammenbasteln der das Ergebnis enthält.</p>
<p>Eine (wahrscheinlich etwas umständliche) Möglichkeit ersteres zu machen wäre so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

typedef unsigned long ulong;

template &lt;ulong N&gt; struct is_divisible_by_3 // nur als Beispiel, hab grad kein &quot;is_prime&quot; Template zur Hand
{
	static const bool value = (N % 3) == 0;
};

template &lt;ulong BEGIN, ulong END, template &lt;ulong N&gt; class F, class STREAM, bool FINISHED&gt; struct print_range_helper;

template &lt;ulong BEGIN, ulong END, template &lt;ulong N&gt; class F, class STREAM&gt; struct print_range_helper&lt;BEGIN, END, F, STREAM, false&gt;
{
	static void do_print(STREAM&amp; s)
	{
		s &lt;&lt; BEGIN &lt;&lt; &quot;: &quot; &lt;&lt; F&lt;BEGIN&gt;::value &lt;&lt; std::endl;
		static const ulong NEXT = BEGIN &lt; END ? BEGIN + 1 : BEGIN - 1;
		print_range_helper&lt;NEXT, END, F, STREAM, NEXT == END&gt;::do_print(s);
	}
};

template &lt;ulong BEGIN, ulong END, template &lt;ulong N&gt; class F, class STREAM&gt; struct print_range_helper&lt;BEGIN, END, F, STREAM, true&gt;
{
	static void do_print(STREAM&amp; s)
	{
		s &lt;&lt; BEGIN &lt;&lt; &quot;: &quot; &lt;&lt; F&lt;BEGIN&gt;::value &lt;&lt; std::endl;
	}
};

template &lt;ulong BEGIN, ulong END, template &lt;ulong N&gt; class F, class STREAM&gt; void print_range(STREAM&amp; s)
{
	print_range_helper&lt;BEGIN, END, F, STREAM, BEGIN == END&gt;::do_print(s);
};

int main() 
{	
	print_range&lt;1, 100, is_divisible_by_3&gt;(std::cout);
}
</code></pre>
<p>p.S.: es müsste auch gehen ohne den Typ für das &quot;Funktor Template&quot; auf &quot;unsigned long&quot; zu fixieren - mag mir darüber aber grad nicht nochmehr den Kopf zerbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411946</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 28 Nov 2007 23:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Thu, 29 Nov 2007 06:10:08 GMT]]></title><description><![CDATA[<p>Nein, hier machen Templates irgendwie keinen Sinn. Was Du brauchst sind ganz normale Funktionen und nicht nur reine Datentypen.</p>
<pre><code class="language-cpp">bool ist_primzahl(int zahl)
{
   // Hier muss ein Primzahltest rein. Siehe 
   // http://de.wikipedia.org/wiki/Primzahl#Primzahltests
}

//Template vielleicht für den Datentyp
template&lt;typename zahlT&gt;
bool ist_primzahl(zahlT zahl)
{
   ...
}

//Funktion, um die nächsthöhere Primzahl zu finden
template&lt;typename zahlT&gt;
zahlT next_primzahl(zahlT start)
{
   ...
}
</code></pre>
<p>Wenn Du versuchst in einer Schleife die Template Parameter zu verändern, dann müsste der Compiler für jeden Wert eine neue Instanz Deiner Funktion erzeugen. Bei i=0 bis 99 sind das also 100 Funktionen. Das kommt mir doch ein wenig komisch vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1411969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1411969</guid><dc:creator><![CDATA[Wirdbald]]></dc:creator><pubDate>Thu, 29 Nov 2007 06:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Thu, 29 Nov 2007 09:41:25 GMT]]></title><description><![CDATA[<p>Wirdbald schrieb:</p>
<blockquote>
<p>Nein, hier machen Templates irgendwie keinen Sinn. Was Du brauchst sind ganz normale Funktionen und nicht nur reine Datentypen.</p>
<pre><code class="language-cpp">bool ist_primzahl(int zahl)
{
   // Hier muss ein Primzahltest rein. Siehe 
   // http://de.wikipedia.org/wiki/Primzahl#Primzahltests
}

//Template vielleicht für den Datentyp
template&lt;typename zahlT&gt;
bool ist_primzahl(zahlT zahl)
{
   ...
}

//Funktion, um die nächsthöhere Primzahl zu finden
template&lt;typename zahlT&gt;
zahlT next_primzahl(zahlT start)
{
   ...
}
</code></pre>
<p>Wenn Du versuchst in einer Schleife die Template Parameter zu verändern, dann müsste der Compiler für jeden Wert eine neue Instanz Deiner Funktion erzeugen. Bei i=0 bis 99 sind das also 100 Funktionen. Das kommt mir doch ein wenig komisch vor.</p>
</blockquote>
<p>Vielleicht ist dieses Beispiel nicht so günstig gewählt. Grundsätzlich geht es aber genau darum gewisse Berechnung schon zur Compiletime durchzuführen.</p>
<p><a href="http://de.wikipedia.org/wiki/C%2B%2B-Metaprogrammierung" rel="nofollow">http://de.wikipedia.org/wiki/C%2B%2B-Metaprogrammierung</a></p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412061</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 29 Nov 2007 09:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Thu, 29 Nov 2007 14:59:56 GMT]]></title><description><![CDATA[<p><a href="http://www.erwin-unruh.de/primorig.html" rel="nofollow">http://www.erwin-unruh.de/primorig.html</a> Ist es das was du suchst? (Uebrigens eine der ersten Anwendungen von Metaprogramming mit templates)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412345</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 29 Nov 2007 14:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Thu, 29 Nov 2007 18:43:23 GMT]]></title><description><![CDATA[<p>Ich weiß schon, dass man das mit normalen Funktionen hinbekommt. Ich wollte mich aber ein wenig in die Metaprogrammierung einarbeiten und dazu ein paar mathematische Berechnungen durchführen. Fakultäten+Fibonacci-Zahlen sind ja ziemlich simpel, also hab ich mal eine Primzahlprüfung gemacht, die ja auch funktioniert. Inzwischen sieht mein Code auch schon so aus:</p>
<pre><code class="language-cpp">If &lt; IsPrime&lt;5&gt;,
    PrintNumber&lt;5&gt;
&gt;();
</code></pre>
<p>Die Ausgabe findet natürlich zur Laufzeit statt, anders wäre es schliesslich nicht möglich. Der Vorteil ist, dass man einen Algorithmus formulieren kann, dieser aber schon zur Kompilierzeit durchgeführt wird. Es sind also zur Laufzeit keine Berechnungen nötig, sogar die &quot;If-Abfrage&quot; wird vollkommen eliminiert.<br />
Das Prinzip der Schleifen Realisierung habe ich dank euren Tipps auch verstanden. Werde mal sehen, was sich da noch so machen lässt.</p>
<p>EDIT:<br />
Okay, hab eure Ratschläge mal beherzigt. Das Ausgeben erfolgt nun erst in einen Stream und wird dann erst über eine Funktion ausgegeben. Die For-Schleife funktioniert schon mal ganz gut:</p>
<pre><code class="language-cpp">int main()
{
	using namespace dons::meta;

	ForTo &lt;1, 100, 
		PrintIfIsPrime 
	&gt;();

	print(std::cout);

	return 0;
}
</code></pre>
<p>Das Programm gibt die Primzahlen bis 100 auf std::cout aus. Berechnet werden sie zur Kompilierzeit (das dauert etwas, da meine Methode nicht gerade optimal ist).<br />
Nochmal Danke für die Hilfe.</p>
<p>Gruß<br />
Don06</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412420</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Thu, 29 Nov 2007 18:43:23 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Thu, 29 Nov 2007 23:48:51 GMT]]></title><description><![CDATA[<p>Don06, guck dir boost.mpl an, das wird dein Herz erfreuen denke ich <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/1412658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412658</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 29 Nov 2007 23:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen mit bzw. in Templates realisieren on Fri, 30 Nov 2007 13:16:47 GMT]]></title><description><![CDATA[<p>Danke, ich hab mir schon den mpl::vector angeschaut. Das ist echt Wahnsinn, was man so alles machen. Das ganze sollte halt nur mal zum Ausprobieren von einigen Template-Mechanismen sein (was ist möglich, und was nicht).</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412911</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 30 Nov 2007 13:16:47 GMT</pubDate></item></channel></rss>