<?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[Variadic templates in Klassen und Funktionen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte gerne die variable Anzahl von Argumenten, die mir in einem Funktionsaufruf zugespielt wurde, speichern und sie zu einem späteren Zeitpunkt wieder an eine andere Funktion weiter geben.</p>
<p>Ich habe mal versucht das Problem mit Quelltext zu visualisieren <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>
<pre><code class="language-cpp">#include &lt;tuple&gt;

template&lt; typename T, typename... P &gt;
class Foo
{
public :
  void
  setP( P... p );

  void
  init();

private :
  T*                  t_; // Soll zu einem beliebigen Zeitpunkt initialisiert werden
  std::tuple&lt; P... &gt;  p_; // Haelt die Argumente fuer den Konstruktor von T
};

template&lt; typename T, typename... P &gt;
void
Foo&lt; T, P... &gt;::setP( P... p )
{
  // Oder kann ich die argumente auch in anderer Form in Foo speichern?
  p_ = std::tuple&lt; P... &gt;( p... );
}

template&lt; typename T, typename ...P &gt;
void
Foo&lt; T, P... &gt;::init()
{
  t_ = new T(); // Will ich nicht :(
  // Hier soll aber nicht der Standardkonstruktor und nicht ein Konstruktor,
  // der ein Tuple als Argument nimmt sonder einer der die einzelnen Elemente
  // des Tuple nimmt stehen.
  // Etwa sowas:
  // t_ = new T( std::get&lt; 0 &gt;( p_ ), ...... , std::get&lt; N &gt;( p_ ) );
  // Denn in meinem Quelltext waere das sehr viel Aufwand alle Konstruktoren
  // auf Tuple nachzuruesten, die ich an dieser Stelle gerne verwenden wuerde :(
}
</code></pre>
<p>Was ich suche ist also die Möglichkeit ein Tuple wieder in eine variable Argumentenliste zu überführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219395/variadic-templates-in-klassen-und-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:54:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219395.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Aug 2008 15:57:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sat, 02 Aug 2008 15:57:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte gerne die variable Anzahl von Argumenten, die mir in einem Funktionsaufruf zugespielt wurde, speichern und sie zu einem späteren Zeitpunkt wieder an eine andere Funktion weiter geben.</p>
<p>Ich habe mal versucht das Problem mit Quelltext zu visualisieren <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>
<pre><code class="language-cpp">#include &lt;tuple&gt;

template&lt; typename T, typename... P &gt;
class Foo
{
public :
  void
  setP( P... p );

  void
  init();

private :
  T*                  t_; // Soll zu einem beliebigen Zeitpunkt initialisiert werden
  std::tuple&lt; P... &gt;  p_; // Haelt die Argumente fuer den Konstruktor von T
};

template&lt; typename T, typename... P &gt;
void
Foo&lt; T, P... &gt;::setP( P... p )
{
  // Oder kann ich die argumente auch in anderer Form in Foo speichern?
  p_ = std::tuple&lt; P... &gt;( p... );
}

template&lt; typename T, typename ...P &gt;
void
Foo&lt; T, P... &gt;::init()
{
  t_ = new T(); // Will ich nicht :(
  // Hier soll aber nicht der Standardkonstruktor und nicht ein Konstruktor,
  // der ein Tuple als Argument nimmt sonder einer der die einzelnen Elemente
  // des Tuple nimmt stehen.
  // Etwa sowas:
  // t_ = new T( std::get&lt; 0 &gt;( p_ ), ...... , std::get&lt; N &gt;( p_ ) );
  // Denn in meinem Quelltext waere das sehr viel Aufwand alle Konstruktoren
  // auf Tuple nachzuruesten, die ich an dieser Stelle gerne verwenden wuerde :(
}
</code></pre>
<p>Was ich suche ist also die Möglichkeit ein Tuple wieder in eine variable Argumentenliste zu überführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558109</guid><dc:creator><![CDATA[FeBrex]]></dc:creator><pubDate>Sat, 02 Aug 2008 15:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sat, 02 Aug 2008 16:59:20 GMT]]></title><description><![CDATA[<p>Ich denke uns beiden ist klar, dass die Sprache keine Unterstützung dafür hat. std::tuple ist einfach nur ein Template und die variadic templates sind ein Sprachkonstrukt, d.h. das funktioniert nur in eine Richtung.</p>
<p>Dann schreib die anderen Klassen halt um, sieh es als Lehrgeld <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=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558134</guid><dc:creator><![CDATA[OMFG]]></dc:creator><pubDate>Sat, 02 Aug 2008 16:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sat, 02 Aug 2008 18:06:09 GMT]]></title><description><![CDATA[<p>OMFG schrieb:</p>
<blockquote>
<p>Ich denke uns beiden ist klar, dass die Sprache keine Unterstützung dafür hat. std::tuple ist einfach nur ein Template und die variadic templates sind ein Sprachkonstrukt, d.h. das funktioniert nur in eine Richtung.</p>
</blockquote>
<p>Was zu beweisen wäre. Ich bezweifle jedenfalls, das wir ohne einige Erfahrung jetzt schon mit Sicherheit sagen können, was mit variadic templates möglich ist und was nicht.<br />
Für das Problem habe ich auch noch keine Lösung.<br />
Nehmen wir der Einfachheit halber zunächst an, dass jeder Typ im Tupel genau einmal vorkommt, dann müsste</p>
<pre><code class="language-cpp">template&lt; typename T, typename ...P &gt;
void
Foo&lt; T, P... &gt;::init()
{
  t_ = new T( std::get&lt; pos_&lt; P, decltype( p_ ) &gt;::value &gt;( p_ )... );
}
</code></pre>
<p>möglich sein. pos_ sei hier eine Metafunktion, die die Position eines Elements im Tupel bestimmt. So etwas ist definitiv möglich, bereits enthält boost::mpl alles dafür Nötige. Allgemeiner gestellt geht es darum, ob es möglich ist, aus einem Parameter-Pack<br />
typename ... P<br />
ein zweites der Form<br />
int ... i<br />
zu generieren, mit der Folge 0, 1, 2, 3, ... , sizeof...( P ) - 1.<br />
Mein Gefühl sagt mir, dass das möglich sein sollte, aber dafür sind ein paar Probleme aus dem Weg zu räumen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558166</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 02 Aug 2008 18:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sat, 02 Aug 2008 18:31:14 GMT]]></title><description><![CDATA[<p>Ungefähr so könnte es evtl. gehen (ich habe gerade keine Möglichkeit, das zu testen) oder es gibt vielleicht einen Anstoß zur Lösung.</p>
<pre><code class="language-cpp">#include &lt;tuple&gt;

template&lt; int..., typename...&gt;
struct pack_indices;

template&lt; int ... i, typename T, typename ... P &gt;
struct pack_indices&lt; i..., T, P... &gt;
{
    typedef typename pack_indices&lt; i..., sizeof...( i ), P... &gt;::type type;
};
template&lt; int ... i &gt;
struct pack_indices&lt; i... &gt;
{
    typedef pack_indices type;
};

template&lt; typename T, typename... P &gt;
class Foo
{
public :
  void
  setP( P... p );

  template&lt; int ...i &gt;
  void
  init(pack_indices&lt; i... &gt; = typename pack_indices&lt; P... &gt;::type);

private :
  T*                  t_; // Soll zu einem beliebigen Zeitpunkt initialisiert werden
  std::tuple&lt; P... &gt;  p_; // Haelt die Argumente fuer den Konstruktor von T
};

template&lt; typename T, typename ...P &gt;
typename&lt; int ...i&gt;
void
Foo&lt; T, P... &gt;::init(pack_indices&lt; i... &gt;)
{
  t_ = new T( std::get&lt; i &gt;( p_ )... );
...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1558169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558169</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 02 Aug 2008 18:31:14 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sat, 02 Aug 2008 20:51:04 GMT]]></title><description><![CDATA[<p>Also wenn das mal kein Paradebeispiel dafür ist, dass die Syntax dieser ganzen Neuerungen einfach nur furchtbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558247</guid><dc:creator><![CDATA[Ich bin blind]]></dc:creator><pubDate>Sat, 02 Aug 2008 20:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sun, 03 Aug 2008 07:37:08 GMT]]></title><description><![CDATA[<p>Ich hab mal eingehender nach deinem Vorschlag gesucht und diese zwei Dinge ausgegraben:</p>
<p>1. Beschreibung (im Abschnitt Template Metaprogramming)<br />
<a href="http://www.jot.fm/issues/issue_2008_02/article2/index.html" rel="nofollow">http://www.jot.fm/issues/issue_2008_02/article2/index.html</a></p>
<p>2. Implementierung<br />
gcc-4.3.1/gcc/textsuite/g++.dg/cpp0x/variadic-bind.C</p>
<pre><code class="language-cpp">...
// A tuple of integer values
template&lt;int...&gt; struct int_tuple {};

// make_indexes_impl is a helper for make_indexes
template&lt;int I, typename IntTuple, typename... Types&gt;
struct make_indexes_impl;

template&lt;int I, int... Indexes, typename T, typename... Types&gt;
struct make_indexes_impl&lt;I, int_tuple&lt;Indexes...&gt;, T, Types...&gt;
{
  typedef typename make_indexes_impl&lt;I+1,
                                     int_tuple&lt;Indexes..., I&gt;,
                                     Types...&gt;::type type;
};

template&lt;int I, int... Indexes&gt;
struct make_indexes_impl&lt;I, int_tuple&lt;Indexes...&gt; &gt; {
  typedef int_tuple&lt;Indexes...&gt; type;
};

// make_indexes takes a variable-length number of N types and
// generates an int_tuple that contains &lt;0, 1, 2, ..., N-1&gt;. These can
// be used as indexes for tuple's get or tuple_element operation.
template&lt;typename... Types&gt; 
struct make_indexes : make_indexes_impl&lt;0, int_tuple&lt;&gt;, Types...&gt; { };

// Get the Ith tuple element, but only if I is in bounds.
template&lt;int I, typename Tuple, typename = void&gt; 
struct safe_tuple_element{ };

template&lt;int I, typename... Values&gt;
struct safe_tuple_element&lt;I, tuple&lt;Values...&gt;, 
         typename enable_if&lt;(I &gt;= 0 &amp;&amp; 
                             I &lt; tuple_size&lt;tuple&lt;Values...&gt; &gt;::value)
                            &gt;::type&gt;
{
  typedef typename tuple_element&lt;I, tuple&lt;Values...&gt; &gt;::type type;
};

// mu maps a bound argument to an actual argument, given a tuple of
// the arguments passed to the function object returned by bind().

// Return the stored reference from reference_wrapper
template&lt;typename T, typename... Args&gt;
inline T&amp; mu(reference_wrapper&lt;T&gt;&amp; bound_arg, const tuple&lt;Args&amp;...&gt;&amp;)
{
  return bound_arg.get();
}

// Unwrap a tuple into separate arguments and forward to the function
// object f.
template&lt;typename F, int... Indexes, typename... Args&gt;
inline typename F::result_type
unwrap_and_forward(F&amp; f, int_tuple&lt;Indexes...&gt;, const tuple&lt;Args&amp;...&gt;&amp; args)
{
  return f(get&lt;Indexes&gt;(args)...);
}
...
</code></pre>
<p>EDIT:<br />
Und benutzen tut man das ganze wie in diesem Artikel beschrieben:<br />
<a href="http://www.archivum.info/comp.std.c++/2006-08/msg00246.html" rel="nofollow">http://www.archivum.info/comp.std.c++/2006-08/msg00246.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558331</guid><dc:creator><![CDATA[FeBrex]]></dc:creator><pubDate>Sun, 03 Aug 2008 07:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sun, 03 Aug 2008 10:50:14 GMT]]></title><description><![CDATA[<p>Kudos, camper!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558428</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 03 Aug 2008 10:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic templates in Klassen und Funktionen on Sun, 03 Aug 2008 12:00:05 GMT]]></title><description><![CDATA[<p>Okay, wenn ich das mal mit der Syntax vergleiche, die meine momentane Lösung für genau dieses Problem hat...</p>
<p>Das sind sicher 100 Zeilen Code und 15 Makros unterschied. Hammer.</p>
<p>Nichtsdestotrotz bin ich mit der Allgemeinen Syntax noch nicht zufrieden. Verdammte rückwärtskompatibilität :(. Man könnte soviele Tolle Sachen so einfach machen, wenn man mal eine Generalisierung wie arrays=tuple=argumentliste machen würde. Aber nein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558454</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 03 Aug 2008 12:00:05 GMT</pubDate></item></channel></rss>