<?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[tamplateparameter: compilezeit-konstante ausdrücke; templates+vererbung]]></title><description><![CDATA[<p>ich benutze grade, nach 2 jahren c++-pause (und ohne früher was mit templates gemacht zu haben) und der nächtlichen lektüre von &quot;effektiv c++ programmieren&quot; sprachmittel die ich eigentlich gar nicht verstanden habe. daher ergeben sich so einige probleme.</p>
<p>(vorneweg: ich brauch' allerhöchste performance!)</p>
<p>ich möchte in einem klassentemplate mit int-parametern a,b ein (c-)array mit konstanter größe haben.<br />
kein problem ist: T foo[a*b] //der compiler wertet das wohl beim compilieren aus</p>
<p>problem: float foo[pow(a,b)].</p>
<p>meine lösung:</p>
<pre><code class="language-cpp">T mat[(b == 1) ? a : ( (b==2) ? a*a : ( (b==3) ? a*a*a : a*a*a*a ))];
//größer wird es hoffentlich nicht
</code></pre>
<p>aber das finde ich hässlich. ich habe sowas versucht:</p>
<pre><code class="language-cpp">//in der gleichen .h
     template&lt;unsigned short a, int b&gt;  
	class Aux {
	public:
		static const size_t intPow() {
			return (b == 1) ? a : ( (b==2) ? a*a : a*a*a)
		//	int res = 1;
		//	for (int i=0; i &lt; b; ++i)
		//		res*=a;
		//	return res;
		}
	};  

 //...
 //in meiner eigentlichen klasse dann:
  T mat[Aux&lt;n,rank&gt;::intPow()];
</code></pre>
<p>(sowohl mit (das wäre natürlich optimal) als auch ohne dem auskommentierten teil)</p>
<p>Oder auch (wieder ganz in der klasse um die es geht)</p>
<pre><code class="language-cpp">private:
const unsigned int size;  //wird im konstruktor mit templateparametern initiallisiert,
// mit der standard pow-funktion (wenn ich pow z.b. global einer konstanten zuweise, schaffts der compiler offenbar plötzlich, 
//es zur compilezeit auszuwerten, aber ich bekomme trotzdem den fehler, dass size unbekannt ist)

		T mat[size];
</code></pre>
<p>Also ich vermute ja, dass der letzte ansatz ein ganz anderes problem hat als das davor. aber auch hier würde mich interessieren: warum geht das nicht? zur compilezeit wird doch bei jeder instanziierung der konstruktor als funktionsaufruf reinkopiert, aber da steht doch die initiallisierung der konstante bereits drin. im moment der instanziierung ist die konstante also bestimmt. erst dann muss doch auch das array angelegt werden. warum passiert das dann nicht einfach?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242789/tamplateparameter-compilezeit-konstante-ausdrücke-templates-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 21:15:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242789.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Jun 2009 09:41:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to tamplateparameter: compilezeit-konstante ausdrücke; templates+vererbung on Mon, 08 Jun 2009 09:41:18 GMT]]></title><description><![CDATA[<p>ich benutze grade, nach 2 jahren c++-pause (und ohne früher was mit templates gemacht zu haben) und der nächtlichen lektüre von &quot;effektiv c++ programmieren&quot; sprachmittel die ich eigentlich gar nicht verstanden habe. daher ergeben sich so einige probleme.</p>
<p>(vorneweg: ich brauch' allerhöchste performance!)</p>
<p>ich möchte in einem klassentemplate mit int-parametern a,b ein (c-)array mit konstanter größe haben.<br />
kein problem ist: T foo[a*b] //der compiler wertet das wohl beim compilieren aus</p>
<p>problem: float foo[pow(a,b)].</p>
<p>meine lösung:</p>
<pre><code class="language-cpp">T mat[(b == 1) ? a : ( (b==2) ? a*a : ( (b==3) ? a*a*a : a*a*a*a ))];
//größer wird es hoffentlich nicht
</code></pre>
<p>aber das finde ich hässlich. ich habe sowas versucht:</p>
<pre><code class="language-cpp">//in der gleichen .h
     template&lt;unsigned short a, int b&gt;  
	class Aux {
	public:
		static const size_t intPow() {
			return (b == 1) ? a : ( (b==2) ? a*a : a*a*a)
		//	int res = 1;
		//	for (int i=0; i &lt; b; ++i)
		//		res*=a;
		//	return res;
		}
	};  

 //...
 //in meiner eigentlichen klasse dann:
  T mat[Aux&lt;n,rank&gt;::intPow()];
</code></pre>
<p>(sowohl mit (das wäre natürlich optimal) als auch ohne dem auskommentierten teil)</p>
<p>Oder auch (wieder ganz in der klasse um die es geht)</p>
<pre><code class="language-cpp">private:
const unsigned int size;  //wird im konstruktor mit templateparametern initiallisiert,
// mit der standard pow-funktion (wenn ich pow z.b. global einer konstanten zuweise, schaffts der compiler offenbar plötzlich, 
//es zur compilezeit auszuwerten, aber ich bekomme trotzdem den fehler, dass size unbekannt ist)

		T mat[size];
</code></pre>
<p>Also ich vermute ja, dass der letzte ansatz ein ganz anderes problem hat als das davor. aber auch hier würde mich interessieren: warum geht das nicht? zur compilezeit wird doch bei jeder instanziierung der konstruktor als funktionsaufruf reinkopiert, aber da steht doch die initiallisierung der konstante bereits drin. im moment der instanziierung ist die konstante also bestimmt. erst dann muss doch auch das array angelegt werden. warum passiert das dann nicht einfach?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723148</guid><dc:creator><![CDATA[stock]]></dc:creator><pubDate>Mon, 08 Jun 2009 09:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to tamplateparameter: compilezeit-konstante ausdrücke; templates+vererbung on Mon, 08 Jun 2009 11:40:34 GMT]]></title><description><![CDATA[<p>stock schrieb:</p>
<blockquote>
<p>Also ich vermute ja, dass der letzte ansatz ein ganz anderes problem hat als das davor. aber auch hier würde mich interessieren: warum geht das nicht? zur compilezeit wird doch bei jeder instanziierung der konstruktor als funktionsaufruf reinkopiert, aber da steht doch die initiallisierung der konstante bereits drin. im moment der instanziierung ist die konstante also bestimmt. erst dann muss doch auch das array angelegt werden. warum passiert das dann nicht einfach?</p>
</blockquote>
<p>Das geht nicht weil wie du schon geschrieben hast der Konstruktor die Variable belegt, und das geschieht eben erst zur Laufzeit. Ein Compilezeit-pow ist aber einfach per Rekursion zu machen:</p>
<pre><code class="language-cpp">template &lt;int base, unsigned int exponent&gt;
struct Pow
{
  const static long value = base * Pow&lt;base, exponent-1&gt;::value;
};

template &lt;int base&gt;
struct Pow&lt;base, 0&gt;
{
  const static long value = 1;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1723193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723193</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 08 Jun 2009 11:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to tamplateparameter: compilezeit-konstante ausdrücke; templates+vererbung on Mon, 08 Jun 2009 12:12:59 GMT]]></title><description><![CDATA[<p>wunderbar, klappt einwandfrei, danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723213</guid><dc:creator><![CDATA[stock]]></dc:creator><pubDate>Mon, 08 Jun 2009 12:12:59 GMT</pubDate></item></channel></rss>