<?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[Parameter-Pack lässt sich nicht entpacken?]]></title><description><![CDATA[<p>Hallo!<br />
Vor graumer Zeit habe ich einen Thread eröffnet, in dem mir KK einen netten Lösungsvorschlag mit TMP zeigte. Das Problem:<br />
Ich will zur Compiletime einen Index in eine Index-Liste (per Parameter-Pack) verwandeln, etwa so:</p>
<pre><code class="language-cpp">typename make_list&lt;6u&gt;::type list;
// List soll jetzt das int-Pack beinhalten, sprich soll der Typ
// make_list&lt;6u&gt;::type&lt;0, 1, 2, 3, 4, 5&gt; sein
function(list)...;
/* Das soll dann zu
function(0), function(1) ... function(5);
werden
*/
</code></pre>
<p>Um das zu testen habe ich folgenden Code geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

template &lt;typename T&gt;
struct id {
	typedef T type;
};

template &lt;unsigned...&gt;
struct pack { };

template &lt;unsigned head, unsigned... tail&gt;
struct pack_index {
	typedef typename pack_index&lt;head - 1, head - 1, tail...&gt;::type type;
};

template &lt;unsigned... tail&gt;
struct pack_index&lt;0u, tail...&gt; {
	typedef pack&lt;tail...&gt; type;
};

void fun(unsigned e) {
	std::cout &lt;&lt; e &lt;&lt; ' ';
}

int main() {
	typename id&lt;typename pack_index&lt;6u&gt;::type&gt;::type packet; //ja, sieht komisch aus
	std::cout &lt;&lt; typeid(packet).name() &lt;&lt; std::endl;
	fun(packet)...;
	std::system(&quot;pause&quot;);
}
</code></pre>
<p>Am Ende will ich also schön die Ausgabe <code>0 1 2 3 4 5</code> erhalten, klappt aber nicht mit:</p>
<pre><code>error: cannot convert 'id&lt;pack&lt;0u, 1u, 2u, 3u, 4u, 5u&gt; &gt;::type' to 'unsigned int' for argument '1' to 'void fun(unsigned int)'
error: expected ';' before '...' token
</code></pre>
<p>Was mache ich falsch?</p>
<p>Compiler: G++ 4.5.0<br />
kompiliert mit <code>c++ -Wall -o result.exe -std=c++0x main.cpp</code></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275937/parameter-pack-lässt-sich-nicht-entpacken</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:36:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275937.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Oct 2010 15:37:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 15:38:03 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Vor graumer Zeit habe ich einen Thread eröffnet, in dem mir KK einen netten Lösungsvorschlag mit TMP zeigte. Das Problem:<br />
Ich will zur Compiletime einen Index in eine Index-Liste (per Parameter-Pack) verwandeln, etwa so:</p>
<pre><code class="language-cpp">typename make_list&lt;6u&gt;::type list;
// List soll jetzt das int-Pack beinhalten, sprich soll der Typ
// make_list&lt;6u&gt;::type&lt;0, 1, 2, 3, 4, 5&gt; sein
function(list)...;
/* Das soll dann zu
function(0), function(1) ... function(5);
werden
*/
</code></pre>
<p>Um das zu testen habe ich folgenden Code geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

template &lt;typename T&gt;
struct id {
	typedef T type;
};

template &lt;unsigned...&gt;
struct pack { };

template &lt;unsigned head, unsigned... tail&gt;
struct pack_index {
	typedef typename pack_index&lt;head - 1, head - 1, tail...&gt;::type type;
};

template &lt;unsigned... tail&gt;
struct pack_index&lt;0u, tail...&gt; {
	typedef pack&lt;tail...&gt; type;
};

void fun(unsigned e) {
	std::cout &lt;&lt; e &lt;&lt; ' ';
}

int main() {
	typename id&lt;typename pack_index&lt;6u&gt;::type&gt;::type packet; //ja, sieht komisch aus
	std::cout &lt;&lt; typeid(packet).name() &lt;&lt; std::endl;
	fun(packet)...;
	std::system(&quot;pause&quot;);
}
</code></pre>
<p>Am Ende will ich also schön die Ausgabe <code>0 1 2 3 4 5</code> erhalten, klappt aber nicht mit:</p>
<pre><code>error: cannot convert 'id&lt;pack&lt;0u, 1u, 2u, 3u, 4u, 5u&gt; &gt;::type' to 'unsigned int' for argument '1' to 'void fun(unsigned int)'
error: expected ';' before '...' token
</code></pre>
<p>Was mache ich falsch?</p>
<p>Compiler: G++ 4.5.0<br />
kompiliert mit <code>c++ -Wall -o result.exe -std=c++0x main.cpp</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969571</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 23 Oct 2010 15:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 21:29:11 GMT]]></title><description><![CDATA[<p>Da steht cannot convert er denkt warscheinlich das das strings oder so sind weil er es nicht in unsigned int umwandeln kann. Und lass hinter fun(packet) die ... weg vielleicht hilfts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969770</guid><dc:creator><![CDATA[CCodex]]></dc:creator><pubDate>Sat, 23 Oct 2010 21:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 21:40:27 GMT]]></title><description><![CDATA[<p>Nö, der Elipsen-Operator (...) ist dort schon richtig gewählt (hoffe ich), da ich ja den Pack in seine einzelnen unsigned-Bestandteile aufteilen will. Er will hier aber scheinbar nicht entpacken, sondern den Pack so übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969773</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 23 Oct 2010 21:40:27 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 22:51:10 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>[quote=&quot;Ad aCTa&quot;]</p>
<pre><code class="language-cpp">typename make_list&lt;6u&gt;::type list;
// List soll jetzt das int-Pack beinhalten, sprich soll der Typ
// make_list&lt;6u&gt;::type&lt;0, 1, 2, 3, 4, 5&gt; sein
function(list)...;
/* Das soll dann zu
function(0), function(1) ... function(5);
werden
*/
</code></pre>
<p>Das wird leider nicht funktionieren, da make_list&lt;6&gt;::type ein TYP und kein Parameter_PACK ist. Egal wie du es auch drehst, in C++ kannst du nur ein Typ instantiieren.<br />
Was du aber tun könntest ist ist eine Klasse zu schreiben die einen Funktor und den TYP &quot;Pack&quot; als template-parameter entgegen nimmt und anschließend evaluiert, zu Proggen.</p>
<p>Pack und make_Pack könnte so aussehen:</p>
<pre><code class="language-cpp">template&lt;unsigned...Args&gt;
class Pack
{
  template&lt;uint I, unsigned Arg0, unsigned...Args&gt;
  class Iterator : public Iterator&lt;I-1,Args...&gt;
  {};

  template&lt;unsigned Arg0, unsigned...Args&gt;
  struct Iterator&lt;0,Arg0,Args...&gt;
  {
    enum eResult{ Result = Arg0 };
  };

  template&lt;uint I&gt;
  class Pack_Iterator&lt;I&gt;
  {};

public:

  enum eSize : unsigned { Size = sizeof...(Args) };

  typedef Pack&lt;Args...&gt; type;

  template&lt;uint...E&gt;
  struct Prepend : public Pack&lt;E...,Args...&gt;
  {};

  template&lt;uint I&gt;
  struct Get : public Iterator&lt;I,Args...&gt;
  {
    enum eIndex{ Index = I };
  };

};

template&lt;uint I,class Result=Pack&lt;&gt; &gt;
class Make_Pack : public Make_Pack&lt;I-1,typename Result::template Prepend&lt;I&gt;::type&gt;
{};

template&lt;class Result&gt;
class Make_Pack&lt;0&gt; : public Result::template Prepend&lt;0&gt;::type
{};

//--------------------------------------------------------------

template&lt;class aPack, class Functor&gt; // Boost::Functor oder Signal&amp;Slot würde ich dir zu herzen legen
class Eval
{
Functor functor;

....
public:

template&lt;uint I = aPack::Size-1&gt;
inline Ruckgabetyp DoIt()
{
  if(I) this-&gt;functor( aPack::template Get&lt;I&gt;::Result );
  ....
}

};
</code></pre>
<p>Das dürfte dir den nötigen Denkanstoß liefern...</p>
<p>MFG Speed</p>
<p>ps. Bastle grad an einer Variadic Template Library ca in einem monat dürfte sie Release-bereit sein ;P</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969793</guid><dc:creator><![CDATA[Speed]]></dc:creator><pubDate>Sat, 23 Oct 2010 22:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 23:19:53 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Was mache ich falsch?</p>
</blockquote>
<ul>
<li>&quot;typename&quot; in main ist da (außerhalb von Templates) falsch.</li>
<li>&quot;id&lt;blah&gt;::type&quot; ist überflüssig und kann durch &quot;blah&quot; ersetzt werden.</li>
<li>Du versuchst den Pack-Expansions-Operator auf etwas anzuwenden, was kein &quot;Pack&quot; enthält. Es heißt nur so. &quot;Packs&quot; gibt es nur innerhalb von Templates. Das sind entweder &quot;Template-Parameter-Packs&quot; oder &quot;Funktions-Parameter-Packs&quot;.</li>
<li>In diesem Kontext ist der Pack-Expansions-Operator sowieso nicht anwendbar. Das klappt typischerweise nur innerhalb von Klammern, also (p...) --&gt; (p1,p2,p3) und &lt;p...&gt; --&gt; &lt;p1,p2,p3&gt; aber auch bei Vererbung hinter dem Doppelpunkt. Im aktuellen Entwurf gibt es irgendwo eine Liste, die genau sagt, wann und wo der Operator auftreten darf. Die habe ich gerade nicht im Kopf.</li>
</ul>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

// ic = integral constant wrapped in a type
template&lt;class T, T Const&gt;
struct ic { static const T value = Const; };

template&lt;class...&gt; // Unbenanntes Template-(Typ-)Parameter-Pack
struct typelist {};

void foo(unsigned i) {
  cout &lt;&lt; i &lt;&lt; '\n';
}

void bar(typelist&lt;&gt;) {}

template&lt;class T, class...More&gt; // More ist ein Template-(Typ-)Parameter-Pack
void bar(typelist&lt;T,More...&gt;)
{
  foo(T::value); // T = ic&lt;unsigned,wert&gt; mit T::value=wert
  bar(typelist&lt;More...&gt;()); // &lt;-- Legales &quot;Auspacken&quot;
}

template&lt;unsigned...UInts&gt; // UInts ist ein Template-(int-)Parameter-Pack
typelist&lt;ic&lt;unsigned,UInts&gt;...&gt; uints2typelist();
//                         ^^^
//               Auspacken hier erlaubt

int main() {
  // Hier gibt's keine auspackbaren &quot;Packs&quot;
  typedef decltype( uints2typelist&lt;1,2,3,5,8,13&gt;() ) fibonacci;
  bar(fibonacci());
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969794</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 23 Oct 2010 23:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 22:54:48 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Das wird leider nicht funktionieren, da make_list&lt;6&gt;::type ein TYP und kein Parameter_PACK ist.</p>
</blockquote>
<p>KK hat allerdings im früheren Thread gesagt, dass die Template Argument Deduction das auflösen könne:</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>[...]<br />
Es löst das Problem, an ein geeignetes Int-Parameter-Pack zu kommen. Der passende Typ kann über Metaprogrammierung erzeugt werden. Das Int-Parameter-Pack bekommt man dann über die Template-Argument-Deduktion. Das heißt, wenn ich einen Typen wie ipack&lt;0,1,2,3,4,5&gt; über Metaprogrammierung erzeugen kann, kann ich die Funktion</p>
<pre><code class="language-cpp">template&lt;class Tuple, int... Ints&gt;
void weiter(Tuple t, ipack&lt;Ints...&gt;)
{
   foo(std::get&lt;Ints&gt;(t)...);
}
</code></pre>
<p>so aufrufen:</p>
<pre><code class="language-cpp">const int N = tuple_size&lt;my_tuple_type&gt;::value;
typedef mach_mir_ein_ipack&lt;0,N&gt;::type indices; // = ipack&lt;0,1,2,3,4,5&gt;
weiter( my_tuple, indices() );
</code></pre>
<p><strong>Über die Regeln der Template-Argument-Deduktion kommt der Compiler selbst auf die Templateparameter, nämlich</strong></p>
<pre><code>Tuple   = std::tuple&lt;irgendwelche Typen&gt;
Ints... = 0,1,2,3,4,5
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1969795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969795</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 23 Oct 2010 22:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sat, 23 Oct 2010 23:38:41 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<blockquote>
<p>&gt; Das wird leider nicht funktionieren, da make_list&lt;6&gt;::type ein TYP und kein Parameter_PACK ist.</p>
</blockquote>
<p>KK hat allerdings im früheren Thread gesagt, dass die Template Argument Deduction das auflösen könne:</p>
</blockquote>
<p>Dass heist trozdem nicht, make_list&lt;6&gt;::type sei ein Parameter Pack( und mit dem Pack-Expansions-Operator auspackbar) ... wie auch immer über &quot;Template Argument Deduction&quot; kann man aus dem Objekt - über dessen Typ, das Parameter Pack wieder extrahieren(und anschliesend entpacken).</p>
<p>In meinem vorherigen Post kannst du lesen wie man das Paket Packt , in Krümmelkackers Fehler im Code und wie man das Packet richtig auspackt ;P</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969801</guid><dc:creator><![CDATA[Speed]]></dc:creator><pubDate>Sat, 23 Oct 2010 23:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sun, 24 Oct 2010 06:38:05 GMT]]></title><description><![CDATA[<p>Speed schrieb:</p>
<blockquote>
<p>In meinem vorherigen Post kannst du lesen wie man das Paket Packt , <strong>in Krümmelkackers Fehler im Code</strong> und wie man das Packet richtig auspackt ;P</p>
</blockquote>
<p>Wie bitte? Ich verstehe den Teil des Satzes nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969823</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 24 Oct 2010 06:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Parameter-Pack lässt sich nicht entpacken? on Sun, 24 Oct 2010 19:18:02 GMT]]></title><description><![CDATA[<p>@Krümmelkacker : Au ja, der Satz ist Müll. Ich sollte ab Mitternacht keine Post mehr schreiben.<br />
Meinte nur, das du in deinen Post, ihn auf seine Fehler aufmerksam gemacht hast.</p>
<p>MFG Speed</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1970119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1970119</guid><dc:creator><![CDATA[Speed]]></dc:creator><pubDate>Sun, 24 Oct 2010 19:18:02 GMT</pubDate></item></channel></rss>