<?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[boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot;]]></title><description><![CDATA[<p>Hi!<br />
Ich moechte eine bestimmte Art von Functor als Template uebergeben. Als ich das mit Funktionspointern geloest hatte, war das auch kein Problem. Da ich allerdings neben Funktionspointern auch structs mit ueberladenem operator() als Functor uebergeben moechte, wollte ich boost::function verwenden. Dabei meint der GCC allerdings, das das nicht &quot;a valid type for a template constant parameter&quot; sei.</p>
<p>Minimalbeispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/array.hpp&gt;

using namespace std;
using namespace boost;

typedef array&lt;double, 5&gt; Array;
//typedef function &lt; double (Array const&amp;) &gt; Function;
typedef double (*Function)(Array const&amp;); // &lt;== DAS HIER WUERDE FUNKTIONIEREN

template&lt;Function f&gt;
double apply(Array const&amp; a)
{
	return f(a);
}

struct mult
{
	double operator()(Array const&amp; a)
	{
		double p = 1;
		for (unsigned i = 0; i &lt; a.size(); ++i)
			p *= a[i];
		return p;
	}
};

double sum(Array const&amp; a)
{
	double sum  = 0;
	for (unsigned i = 0; i &lt; a.size(); ++i)
		sum += a[i];
	return sum;
}

int main()
{
	Array a = {{1, 2, 3, 4, 5}};
	cout &lt;&lt; &quot;sum:  &quot; &lt;&lt; apply&lt;sum&gt;(a) &lt;&lt; endl;
	cout &lt;&lt; &quot;prod: &quot; &lt;&lt; apply&lt;mult()&gt;(a) &lt;&lt; endl; // &lt;== DAS GEHT NICHT
	return 0;
}
</code></pre>
<p>Was kann ich tun? Ich moechte neben Funktionspointern eben auch Klassen-Functors verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259766/boost-function-quot-is-not-a-valid-type-for-a-template-constant-parameter-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 17:14:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259766.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Jan 2010 14:07:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 14:14:13 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich moechte eine bestimmte Art von Functor als Template uebergeben. Als ich das mit Funktionspointern geloest hatte, war das auch kein Problem. Da ich allerdings neben Funktionspointern auch structs mit ueberladenem operator() als Functor uebergeben moechte, wollte ich boost::function verwenden. Dabei meint der GCC allerdings, das das nicht &quot;a valid type for a template constant parameter&quot; sei.</p>
<p>Minimalbeispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/array.hpp&gt;

using namespace std;
using namespace boost;

typedef array&lt;double, 5&gt; Array;
//typedef function &lt; double (Array const&amp;) &gt; Function;
typedef double (*Function)(Array const&amp;); // &lt;== DAS HIER WUERDE FUNKTIONIEREN

template&lt;Function f&gt;
double apply(Array const&amp; a)
{
	return f(a);
}

struct mult
{
	double operator()(Array const&amp; a)
	{
		double p = 1;
		for (unsigned i = 0; i &lt; a.size(); ++i)
			p *= a[i];
		return p;
	}
};

double sum(Array const&amp; a)
{
	double sum  = 0;
	for (unsigned i = 0; i &lt; a.size(); ++i)
		sum += a[i];
	return sum;
}

int main()
{
	Array a = {{1, 2, 3, 4, 5}};
	cout &lt;&lt; &quot;sum:  &quot; &lt;&lt; apply&lt;sum&gt;(a) &lt;&lt; endl;
	cout &lt;&lt; &quot;prod: &quot; &lt;&lt; apply&lt;mult()&gt;(a) &lt;&lt; endl; // &lt;== DAS GEHT NICHT
	return 0;
}
</code></pre>
<p>Was kann ich tun? Ich moechte neben Funktionspointern eben auch Klassen-Functors verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845755</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 14:27:28 GMT]]></title><description><![CDATA[<p>Mit <code>mult()</code> in <code>apply&lt;mult()&gt;(a)</code> erzeugst du ja eine Instanz, du brauchst ja nen Typ (also nur <code>mult</code> ). Dürfte aber auch nicht klappen durch deine Templateparameter-Einschränkung. Wie wär's so?:</p>
<pre><code class="language-cpp">template&lt;typename Func&gt;
double apply( Array const&amp; a, Func func )
{
    return func( a );
}

apply( a, &amp;sum );
apply( a, mult() );
</code></pre>
<p>Ansonsten würde ich std::tr1::function bzw std::function aus &lt;functional&gt; vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845771</guid><dc:creator><![CDATA[Badestrand_]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 14:36:05 GMT]]></title><description><![CDATA[<p>Badestrand_ schrieb:</p>
<blockquote>
<p>Wie wär's so?:<br />
[...]</p>
</blockquote>
<p>Da der echte Code mehr Parameter hat wuerde das die Funktion extrem aufblaehen, das moecht ich vermeiden. Ausserdem will ich sichergehen dass die Funktionen geinlined werden, da es sich um den absolut performancekritischten Teil der Applikation handelt.</p>
<blockquote>
<p>Ansonsten würde ich std::tr1::function bzw std::function aus &lt;functional&gt; vorziehen.</p>
</blockquote>
<p>std::tr1::function ist doch boost::function, damit gewinn ich dann also auch nix <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845772</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 14:50:34 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ausserdem will ich sichergehen dass die Funktionen geinlined werden, da es sich um den absolut performancekritischten Teil der Applikation handelt.</p>
</blockquote>
<p>Du kannst auf jeden Fall keine Instanz als Template-Paramter übergeben, da gehen nur Typen oder Compile-Time konstante &quot;Werte&quot;.<br />
Funktoren willst du doch sicherlich auch nutzen, um State zu haben; dazu musst du eine konkrete Instanz übergeben und das klappt eben nur mit &quot;normalem&quot; Parameter. Mit Verzicht auf boost::function dürfte das für den Compiler IMO auch recht gut optimierbar sein.</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>std::tr1::function ist doch boost::function, damit gewinn ich dann also auch nix <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Dann hat man halt die boost-Abhängigkeit nicht. Ist hier jetzt aber natürlich egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845784</guid><dc:creator><![CDATA[Badestrand_]]></dc:creator><pubDate>Wed, 27 Jan 2010 14:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 15:22:03 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ich moechte eine bestimmte Art von Functor als Template uebergeben.</p>
</blockquote>
<p>Erster Indikator für ein Missverständnis.</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/array.hpp&gt;

using namespace std;
using namespace boost;

  typedef array&lt;double, 5&gt; Array;
//typedef function &lt; double (Array const&amp;) &gt; Function;
  typedef double (*Function)(Array const&amp;); // &lt;== DAS HIER WUERDE FUNKTIONIEREN
</code></pre>
</blockquote>
<p>Wozu ist &quot;Function&quot; gut?</p>
<blockquote>
<pre><code class="language-cpp">template&lt;Function f&gt;
</code></pre>
</blockquote>
<p>Hier ist f ein nicht-Typ Template-Parameter. Als Nicht-Typ Template-Parameter werden nur integrale Konstanten, Zeiger-Konstanten bzw Referenzen auf Objekte und Funktionen mit externer Bindung erlaubt -- also alles Parameter, welche zur Compile-Zeit bekannt sind. Mit &quot;Function&quot; als alias für function&lt;double(Array const&amp;)&gt; versuchst Du ein <strong>Objekt</strong> als Template-Parameter zu übergeben. Das funktioniert deswegen also nicht.</p>
<blockquote>
<pre><code class="language-cpp">double apply(Array const&amp; a)
{
	return f(a);
}

struct mult
{
	double operator()(Array const&amp; a)
	{
		double p = 1;
		for (unsigned i = 0; i &lt; a.size(); ++i)
			p *= a[i];
		return p;
	}
};

double sum(Array const&amp; a)
{
	double sum  = 0;
	for (unsigned i = 0; i &lt; a.size(); ++i)
		sum += a[i];
	return sum;
}

int main()
{
	Array a = {{1, 2, 3, 4, 5}};
	cout &lt;&lt; &quot;sum:  &quot; &lt;&lt; apply&lt;sum&gt;(a) &lt;&lt; endl;
	cout &lt;&lt; &quot;prod: &quot; &lt;&lt; apply&lt;mult()&gt;(a) &lt;&lt; endl; // &lt;== DAS GEHT NICHT
	return 0;
}
</code></pre>
</blockquote>
<p>Mach's so:</p>
<pre><code class="language-cpp">template&lt;typename FunctorType&gt;
double apply(Array const&amp; a, FunctorType f)
{
	return f(a);
}

struct mult
{
	double operator()(Array const&amp; a) const // &lt;-- habe const hinzugefügt
	{
		double p = 1;
		for (unsigned i = 0; i &lt; a.size(); ++i)
			p *= a[i];
		return p;
	}
};

double sum(Array const&amp; a)
{
	double sum  = 0;
	for (unsigned i = 0; i &lt; a.size(); ++i)
		sum += a[i];
	return sum;
}

int main()
{
	Array a = {{1, 2, 3, 4, 5}};
	cout &lt;&lt; &quot;sum:  &quot; &lt;&lt; apply(a,&amp;sum) &lt;&lt; endl;
	cout &lt;&lt; &quot;prod: &quot; &lt;&lt; apply(a,mult() &lt;&lt; endl;
}
</code></pre>
<p>Ein function&lt;&gt; gibt's hier auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845810</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 27 Jan 2010 15:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Wed, 27 Jan 2010 16:12:44 GMT]]></title><description><![CDATA[<p>Alternativ:</p>
<pre><code class="language-cpp">double apply(Array const&amp; x, function&lt;double(Array const&amp;)&gt; f)
{
  return f(x);
}
</code></pre>
<p>Dazu muss apply kein Template sein. Das ist ja gerade der Witz an function!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845843</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 27 Jan 2010 16:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function &amp;quot;is not a valid type for a template constant parameter&amp;quot; on Thu, 28 Jan 2010 11:52:26 GMT]]></title><description><![CDATA[<p>Thx fuer die Erklaerungen und Tipps <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/1846307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1846307</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 28 Jan 2010 11:52:26 GMT</pubDate></item></channel></rss>