<?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[Haariges Forwarding-Problem]]></title><description><![CDATA[<p>Hallo!<br />
Ich möchte für Windows und C++ einen kleinen Thread-Wrapper konstruieren, der vorzugsweise so funktionieren soll:</p>
<pre><code class="language-cpp">class thread;

void thread_fun(const std::string&amp;, int&amp;&amp;);
int thread_fun(std::vector&lt;unsigned&gt;&amp;&amp;, float, bool);
int thread_fun(const std::vector&lt;unsigned&gt;&amp;, float, bool);

std::string s = &quot;Hello&quot;;
std::vector&lt;unsigned&gt; v = { 3, 1, 8, 3, 9, 1 };
std::shared_ptr&lt;thread&gt; t1 = create_thread(thread_fun, s, 5),
                        t2 = create_thread(thread_fun, { 3, 7, 2, 4 }, 3.3f, true),
                        t3 = create_thread(thread_fun, v, 2.1f, false);
</code></pre>
<p>Die Funktion kann aussehen wie sie will und wie der Nutzer das möchte. Ich würde das mit Variadic Templates und Perfect Forwarding lösen wollen. Leider benötigt die API-Funktion für Threads einen void* als Parameter, wobei viele Typen-Informationen verloren gehen. Außerdem kann ich einen Parameter-Pack nicht in void* konvertieren, weshalb mir nun das Tupel als Forwarder einfiel.<br />
Meine Frage: Wie komme ich nun an die Elemente im Tupel ran (das ja verschieden groß ist), um sie der Client-Funktion im Thread zu übergeben?</p>
<pre><code class="language-cpp">/*

Lese-Reihenfolge: create_thread ---&gt; class thread ---&gt; thread_procedure
;)
*/ 

// Die Funktionssignatur muss mit der API übereinstimmen
template &lt;typename FTy_, typename ...Args&gt;
unsigned __stdcall thread_procedure(void* parameters) {
   void** array = static_cast&lt;void**&gt;(parameters);
   FTy_ function = *static_cast&lt;FTy_*&gt;(array[0]);
   std::tuple&lt;Args_...&gt; tuple = *static_cast&lt;std::tuple&lt;Args...&gt;*&gt;(array[1]);
   // Schön wärs (wie kann ich das machen?):
   try {
      // Hier wird die Funktion aufgerufen, die der Nutzer im Thread laufen haben will
      function(std::forward(tuple.get_parameter_pack())...);
   }
   catch(...) { // Wenn die Funktion 'ne Exception werfen sollte...
      delete array[0];
      delete [] array;
      throw;
   }
   delete array[0];
   delete [] array;
   return 0u;
}

// Thread-Wrapperklasse, Ressourcenverwaltung etc.
class thread {
public:
   template &lt;typename FTy_, typename ...Args_&gt;
   friend std::shared_ptr&lt;thread&gt; create_thread(FTy_, Args_&amp;&amp;...);

private:
   template &lt;typename FTy_, typename ...Args_&gt;
   thread(FTy_ function, Args_&amp;&amp;... args) {
      void** parameters = new void*[2]; // Parameter-Array
      FTy_* fun = new FTy_(function);
      parameters[0] = fun;
      std::tuple&lt;Args_...&gt;* tuple = new std::tuple&lt;Args_...&gt;(std::forward(args)...);
      parameters[1] = tuple;
      // API-Call:
      winapi::create_thread(thread_procedure&lt;FTy_, Args_...&gt;, parameters); 
   }

};

// RAII-Factory
template &lt;typename FTy_, typename ...Args_&gt;
std::shared_ptr&lt;thread&gt; create_thread(FTy_ function, Args_&amp;&amp;... args) {
   return new thread(function, std::forward(args)...);
}
</code></pre>
<p>Sowas wie tuple::get_parameter_pack() gibt's leider nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273922/haariges-forwarding-problem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 19:04:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273922.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Sep 2010 16:05:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Wed, 15 Sep 2010 16:50:59 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich möchte für Windows und C++ einen kleinen Thread-Wrapper konstruieren, der vorzugsweise so funktionieren soll:</p>
<pre><code class="language-cpp">class thread;

void thread_fun(const std::string&amp;, int&amp;&amp;);
int thread_fun(std::vector&lt;unsigned&gt;&amp;&amp;, float, bool);
int thread_fun(const std::vector&lt;unsigned&gt;&amp;, float, bool);

std::string s = &quot;Hello&quot;;
std::vector&lt;unsigned&gt; v = { 3, 1, 8, 3, 9, 1 };
std::shared_ptr&lt;thread&gt; t1 = create_thread(thread_fun, s, 5),
                        t2 = create_thread(thread_fun, { 3, 7, 2, 4 }, 3.3f, true),
                        t3 = create_thread(thread_fun, v, 2.1f, false);
</code></pre>
<p>Die Funktion kann aussehen wie sie will und wie der Nutzer das möchte. Ich würde das mit Variadic Templates und Perfect Forwarding lösen wollen. Leider benötigt die API-Funktion für Threads einen void* als Parameter, wobei viele Typen-Informationen verloren gehen. Außerdem kann ich einen Parameter-Pack nicht in void* konvertieren, weshalb mir nun das Tupel als Forwarder einfiel.<br />
Meine Frage: Wie komme ich nun an die Elemente im Tupel ran (das ja verschieden groß ist), um sie der Client-Funktion im Thread zu übergeben?</p>
<pre><code class="language-cpp">/*

Lese-Reihenfolge: create_thread ---&gt; class thread ---&gt; thread_procedure
;)
*/ 

// Die Funktionssignatur muss mit der API übereinstimmen
template &lt;typename FTy_, typename ...Args&gt;
unsigned __stdcall thread_procedure(void* parameters) {
   void** array = static_cast&lt;void**&gt;(parameters);
   FTy_ function = *static_cast&lt;FTy_*&gt;(array[0]);
   std::tuple&lt;Args_...&gt; tuple = *static_cast&lt;std::tuple&lt;Args...&gt;*&gt;(array[1]);
   // Schön wärs (wie kann ich das machen?):
   try {
      // Hier wird die Funktion aufgerufen, die der Nutzer im Thread laufen haben will
      function(std::forward(tuple.get_parameter_pack())...);
   }
   catch(...) { // Wenn die Funktion 'ne Exception werfen sollte...
      delete array[0];
      delete [] array;
      throw;
   }
   delete array[0];
   delete [] array;
   return 0u;
}

// Thread-Wrapperklasse, Ressourcenverwaltung etc.
class thread {
public:
   template &lt;typename FTy_, typename ...Args_&gt;
   friend std::shared_ptr&lt;thread&gt; create_thread(FTy_, Args_&amp;&amp;...);

private:
   template &lt;typename FTy_, typename ...Args_&gt;
   thread(FTy_ function, Args_&amp;&amp;... args) {
      void** parameters = new void*[2]; // Parameter-Array
      FTy_* fun = new FTy_(function);
      parameters[0] = fun;
      std::tuple&lt;Args_...&gt;* tuple = new std::tuple&lt;Args_...&gt;(std::forward(args)...);
      parameters[1] = tuple;
      // API-Call:
      winapi::create_thread(thread_procedure&lt;FTy_, Args_...&gt;, parameters); 
   }

};

// RAII-Factory
template &lt;typename FTy_, typename ...Args_&gt;
std::shared_ptr&lt;thread&gt; create_thread(FTy_ function, Args_&amp;&amp;... args) {
   return new thread(function, std::forward(args)...);
}
</code></pre>
<p>Sowas wie tuple::get_parameter_pack() gibt's leider nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953043</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Wed, 15 Sep 2010 16:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Thu, 16 Sep 2010 08:55:46 GMT]]></title><description><![CDATA[<p>Also, Du setzt teilweise C++0x voraus, nur ohne C++0x Thread-Unterstützung, wie?</p>
<p>Du kannst eine abstrakte Klasse bauen:</p>
<pre><code class="language-cpp">class wrapped_job
{
public:
  virtual ~wrapped_job() {}
  virtual void run() = 0;
};
</code></pre>
<p>und dahinter den &quot;Job&quot; verstecken. Einen Zeiger auf so ein Objekt kann man zu void* konvertieren und so die API des Betriebssystems bedienen. In der Thread-Funktion castet man wieder zurück:</p>
<pre><code class="language-cpp">extern &quot;C&quot; void my_thread_func(void* context)
{
  try {
    static_cast&lt;wrapped_job*&gt;(context)-&gt;run();
  } catch (...) {
    // Mist!
  }
}
</code></pre>
<p>Eine konkrete Klasse könnte so aussehen:</p>
<pre><code class="language-cpp">template&lt;class Fun, class ParamTuple&gt;
class concrete_wrapped_job : public wrapped_job
{
  Fun fun;
  ParamTuple pt;
public:
  concrete_wrapped_job(Fun fun, ParamTuple pt)
  : fun(fun), pt(pt) {}
  void run() {
    forward_tuple_as_args(fun,pt);
  }
};
</code></pre>
<p>wobei ParamTuple irgendwas in der Art von std::tuple&lt;A,B,...&gt; für bestimmte Typen A,B,... ist. So ein Objekt mit dem Tuple zu erzeugen ist nicht so schwer:</p>
<pre><code class="language-cpp">template&lt;class Fun, class... Args&gt;
unique_ptr&lt;wrapped_job&gt; make_job(Fun fun, Args&amp;&amp;... args)
{
  typedef decltype( make_tuple(forward&lt;Args&gt;(args)...) ) tuple_type;
  unique_ptr&lt;wrapped_job&gt; ptr (
    new concrete_wrapped_job&lt;Fun,tuple_type&gt;(
      fun, make_tuple(forward&lt;Args&gt;(args)...)
    )
  );
  return ptr;
}

:
:

void blah(int,int,double);

void foo()
{
  auto job = make_job( &amp;blah, 2,5,3.1415 );
  job-&gt;run();
}
</code></pre>
<p>Der einzige Knackpunkt ist jetzt noch das <code>forward_tuple_as_args</code> -Template. Dazu braucht man ein bisschen Metaprogrammierung:</p>
<pre><code class="language-cpp">template&lt;int...&gt; struct int_pack {};

template&lt;int Count&gt;
struct make_indices {
  typedef int_pack&lt;0,1,...,Count-1&gt; type; // &lt;-- pseudo code (!)
};

template&lt;class Fun, class ParamTuple, int... Idx&gt;
inline void weiter(Fun &amp;&amp; fun, ParamTuple &amp;&amp; pt, int_pack&lt;Idx...&gt;)
{
  forward&lt;Fun&gt;(fun)(std::get&lt;Idx&gt;(pt)...);
}

template&lt;class Fun, class ParamTuple&gt;
inline void forward_tuple_as_args(Fun &amp;&amp; fun, ParamTuple &amp;&amp; pt)
{
  typedef typename remove_reference&lt;ParamTuple&gt;::type tuple_type;
  typedef typename make_indices&lt;tuple_size&lt;tuple_type&gt;::value&gt;::type idxpck;
  weiter(forward&lt;Fun&gt;(fun),forward&lt;ParamTuple&gt;(pt),idxpck());
}
</code></pre>
<p>Jetzt bleibt aber noch die Frage, wie man die Hilfsklasse <code>make_indices</code> richtig implementiert. Diese Variadic-Template-Übung überlasse ich Dir. :p</p>
<p>BTW: Ich habe das so runtergetippt. Da sind bestimmt noch zig Fehler drin. Aber ich hoffe, dass das Prinzip klar geworden ist.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953081</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 16 Sep 2010 08:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Thu, 16 Sep 2010 09:16:40 GMT]]></title><description><![CDATA[<p>Hier die Lösung für make_indices:</p>
<pre><code class="language-cpp">#include &lt;typeinfo&gt;
#include &lt;cstdlib&gt;

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

template&lt;int... Ints&gt;
struct int_pack {};

template&lt;int Count, int... Tail&gt;
struct make_indices : make_indices&lt;Count-1,Count-1,Tail...&gt; {};
template&lt;int...Tail&gt;
struct make_indices&lt;0,Tail...&gt; : id&lt;int_pack&lt;Tail...&gt; &gt; {};

int main()
{
  typedef make_indices&lt;6&gt;::type T1;
  typedef int_pack&lt;0,1,2,3,4,5&gt; T2;
  return typeid(T1)==typeid(T2) ? EXIT_SUCCESS : EXIT_FAILURE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953278</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 16 Sep 2010 09:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Sat, 18 Sep 2010 13:06:19 GMT]]></title><description><![CDATA[<p>Sorry, hab ich lange nicht sehen lassen. <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="🙂"
    /><br />
Meine Lösung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;typeinfo&gt;

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

template &lt;int n, int... pack&gt;
struct indices {
	typedef typename indices&lt;n - 1, n - 1, pack...&gt;::type type;
};

template &lt;int... p&gt;
struct indices&lt;0, p...&gt; {
	typedef pack&lt;p...&gt; type;
};

int main() {
	if(typeid(indices&lt;2&gt;::type) == typeid(pack&lt;0, 1&gt;))
		std::cout &lt;&lt; &quot;ID!&quot; &lt;&lt; std::endl;
	std::cin.get();
}
</code></pre>
<p>Aber ich verstehe dein <code>idxpck()</code> nicht. operator() ist für int_pack ja nicht definiert. Wie gebe ich ein so ein int_pack zurück?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954122</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 18 Sep 2010 13:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Sat, 18 Sep 2010 15:48:24 GMT]]></title><description><![CDATA[<p>idxpack war bei mir ein Typ und kein Objekt. Mit operator() hat das nichts zu tun. Das ist die &quot;functional syntax&quot; zur Erzeugung eines temporären Objekts vom Typ idxpck. Der Sinn des ganzen ist es, über die Template-Argument-Deduktion wieder an die Indizes ran zukommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;tuple&gt;

void foo(int i,double d,char const* s)
{
   using namespace std;
   cout &lt;&lt; &quot;i = &quot; &lt;&lt; i &lt;&lt; '\n';
   cout &lt;&lt; &quot;d = &quot; &lt;&lt; d &lt;&lt; '\n';
   cout &lt;&lt; &quot;s = &quot; &lt;&lt; s &lt;&lt; '\n';
}

template&lt;int... Ints&gt;
struct ipack {};

template&lt;class Tuple, int... Ints&gt;
void weiter(Tuple t, ipack&lt;Ints...&gt;)
{
   foo(std::get&lt;Ints&gt;(t)...);
}

int main()
{
   using namespace std;
   weiter( make_tuple(&quot;Hallo&quot;,42,3.1415), ipack&lt;1,2,0&gt;() );
}
</code></pre>
<p>Mit Hilfe der Template-Argument-Deduktion extrahiert der Compiler die Indizes aus dem Typ ipack&lt;1,2,0&gt; und stellt sie beim Funktions-Template &quot;weiter&quot; als Template-Parameter-Pack &quot;Ints&quot; zu Verfügung. Wir brauchen ein solches Parameter-Pack, damit die einzelnen Tuple-Elemente einzeln als Parameter weitergeleitet werden können. Das ipack&lt;&gt;-Objekt an sich ist sonst von keinem Nutzen. Deswegen benenne ich es auch gar nicht erst bei der Funktionsdefinition. Vor dem Pack-Expansionsoperator &quot;...&quot; steht das Muster std::get&lt;Ints&gt;(t). Aus dem Einsetzen der Werte von Ints im Muster und dem Aneinanderhängen wird dann<br />
<code>std::get&lt;1&gt;(t), std::get&lt;2&gt;(t), std::get&lt;0&gt;(t)</code><br />
und foo wird dementsprechend mit drei Parametern aufgerufen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954161</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 18 Sep 2010 15:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Mon, 20 Sep 2010 08:50:59 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich frage mich, warum man eigentlich dieses Dummy-Struct benutzen muss? Wenn ich mir das so angucke sehe ich eigentlich kein Grund dagegen, die ints direkt als Parameter zu übergeben.<br />
Also so:</p>
<pre><code class="language-cpp">template&lt;class Tuple, int... Ints&gt;
void weiter(Tuple t, Ints...)
{
   foo(std::get&lt;Ints&gt;(t)...);
}
</code></pre>
<p>Mir ist klar, dass es nicht funktioniert (getestet mit GCC 4.5) aber warum?<br />
Hast du dafür eine Erklärung Krümelkacker?</p>
<p>Gruß Gate</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954646</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Mon, 20 Sep 2010 08:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Mon, 20 Sep 2010 09:30:42 GMT]]></title><description><![CDATA[<p>Weil Ints kein Typ ist und damit nicht in der Parameterliste vorkommen kann.</p>
<p>Analog (zur Verdeutlichung) ohne Ellipse:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; void func(T t); // T ist ein Typ. Expandiert in func&lt;long&gt; zu &quot;long t&quot;
template&lt;int I&gt; void func(I i); // I ist ein Integral. Soll das in func&lt;99&gt; zu &quot;99 i&quot; expandieren???
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1954661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954661</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 20 Sep 2010 09:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Mon, 20 Sep 2010 10:39:15 GMT]]></title><description><![CDATA[<p>Gate schrieb:</p>
<blockquote>
<p>Wenn ich mir das so angucke sehe ich eigentlich kein Grund dagegen, die ints direkt als Parameter zu übergeben.<br />
Also so:</p>
<pre><code class="language-cpp">template&lt;class Tuple, int... Ints&gt;
void weiter(Tuple t, Ints...)
{
   foo(std::get&lt;Ints&gt;(t)...);
}
</code></pre>
<p>Mir ist klar, dass es nicht funktioniert (getestet mit GCC 4.5) aber warum?</p>
</blockquote>
<p><code>Ints</code> ist hier ein &quot;Nicht-Typ-Parameter-Pack&quot;. Das kann so nicht als Funktionsparameter auftauchen; denn Ints... steht für eine durch Komma getrennte Liste von Ganzzahlen.</p>
<p>Man könnte aber folgendes machen:</p>
<pre><code class="language-cpp">template&lt;class Tuple, int... Ints&gt;
void weiter(Tuple t)
{
   foo(std::get&lt;Ints&gt;(t)...);
}
</code></pre>
<p>und die Funktion dann so aufrufen</p>
<pre><code class="language-cpp">weiter&lt;my_tuple_type,0,1,2,3,4,5&gt;(my_tuple);
</code></pre>
<p>Doch gibt es keine Syntax, mit der man solche Template-Parameter on-the-fly erzeugen kann, so wie wir es an dieser Stelle bräuchten. Also, so etwas wie in der Art</p>
<pre><code>weiter&lt;my_tuple_type,sequence(0,tuple_size&lt;my_tuple_type&gt;::value)&gt;(my_tuple);
</code></pre>
<p>gibt es nicht. Wenn man jetzt ein int-Parameter-Pack hätte, könnte man das an dieser Stelle einsetzen:</p>
<pre><code>weiter&lt;my_tuple_type,Ints...&gt;(my_tuple);
</code></pre>
<p>Aber das hilft einem auch nicht weiter, weil sich das Problem so nur verlagert.</p>
<p>Gate schrieb:</p>
<blockquote>
<p>ich frage mich, warum man eigentlich dieses Dummy-Struct benutzen muss?</p>
</blockquote>
<p>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>Über die Regeln der Template-Argument-Deduktion kommt der Compiler selbst auf die Templateparameter, nämlich</p>
<pre><code>Tuple   = std::tuple&lt;[i]irgendwelche Typen[/i]&gt;
Ints... = 0,1,2,3,4,5
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954662</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 20 Sep 2010 10:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Mon, 20 Sep 2010 10:30:47 GMT]]></title><description><![CDATA[<p>Super, vielen Dank euch beiden und tolle Erklärung Krümelkacker.<br />
Eigentlich ist es ja völlig klar, nur habe ich da irgendwie nicht weit genug gedacht <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>
<p>Gruß Gate</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954705</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Mon, 20 Sep 2010 10:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to Haariges Forwarding-Problem on Mon, 20 Sep 2010 11:49:01 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Mit Hilfe der Template-Argument-Deduktion extrahiert der Compiler die Indizes aus dem Typ ipack&lt;1,2,0&gt; und stellt sie beim Funktions-Template &quot;weiter&quot; als Template-Parameter-Pack &quot;Ints&quot; zu Verfügung.</p>
</blockquote>
<p>Ah ja, es war mir noch neu, dass die TAD solche Structs in Parameter-Packs auflösen kann. Super, vielen Dank! <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/1954743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954743</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Mon, 20 Sep 2010 11:49:01 GMT</pubDate></item></channel></rss>