<?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[Zugriff auf n-tes Element eines variadic tuple templates]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein tuple template:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename... Tail&gt;
class tuple{
public:
};

template&lt;typename Head, typename... Tail&gt;
class tuple&lt;Head, Tail...&gt; :public tuple&lt;Tail...&gt;{
public:
        Head value;
        typedef tuple&lt;Tail...&gt; type;

        tuple(Head h, Tail... t) : tuple&lt;Tail...&gt;(t...), value(h){
        }
};

template&lt;typename Head, typename... Tail&gt;
void print(tuple&lt;Head, Tail...&gt;&amp; t){
        std::cout &lt;&lt; t.value &lt;&lt; ' ';
        print(static_cast&lt;typename tuple&lt;Head, Tail...&gt;::type&amp;&gt;(t));

}

template&lt;typename Head&gt;
void print(tuple&lt;Head&gt;&amp; t){
        std::cout &lt;&lt; t.value &lt;&lt; std::endl;
}

int main(){
        tuple&lt;int, double, char, int&gt; t(1, 1.1, 'c', 2);
        print(t);
}
</code></pre>
<p>Wie kann ich am elegantesten z.B. (nur) den char des Tupels auslesen oder verändern?<br />
Also am liebsten hätte ich eine Art Index-Zugriff...<br />
Eine weitere Frage nebenbei: Ist das Vorgehen mit dem static_cast und dem rekursiven Aufruf so empfehlenswert oder wie macht man es sonst?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291154/zugriff-auf-n-tes-element-eines-variadic-tuple-templates</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 21:25:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291154.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Aug 2011 18:40:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 18:40:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein tuple template:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename... Tail&gt;
class tuple{
public:
};

template&lt;typename Head, typename... Tail&gt;
class tuple&lt;Head, Tail...&gt; :public tuple&lt;Tail...&gt;{
public:
        Head value;
        typedef tuple&lt;Tail...&gt; type;

        tuple(Head h, Tail... t) : tuple&lt;Tail...&gt;(t...), value(h){
        }
};

template&lt;typename Head, typename... Tail&gt;
void print(tuple&lt;Head, Tail...&gt;&amp; t){
        std::cout &lt;&lt; t.value &lt;&lt; ' ';
        print(static_cast&lt;typename tuple&lt;Head, Tail...&gt;::type&amp;&gt;(t));

}

template&lt;typename Head&gt;
void print(tuple&lt;Head&gt;&amp; t){
        std::cout &lt;&lt; t.value &lt;&lt; std::endl;
}

int main(){
        tuple&lt;int, double, char, int&gt; t(1, 1.1, 'c', 2);
        print(t);
}
</code></pre>
<p>Wie kann ich am elegantesten z.B. (nur) den char des Tupels auslesen oder verändern?<br />
Also am liebsten hätte ich eine Art Index-Zugriff...<br />
Eine weitere Frage nebenbei: Ist das Vorgehen mit dem static_cast und dem rekursiven Aufruf so empfehlenswert oder wie macht man es sonst?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105000</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 18:40:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 18:49:41 GMT]]></title><description><![CDATA[<p>TypeAt:</p>
<pre><code class="language-cpp">template &lt;int, typename...&gt;
struct TypeAt;

template &lt;int N, typename Head, typename... Tail&gt;
struct TypeAt&lt;N, Head, Tail...&gt;
{
        typedef typename TypeAt&lt;N - 1, Tail...&gt;::type type;
};

template &lt;typename Head, typename... Tail&gt;
struct TypeAt&lt;0, Head, Tail...&gt;
{
        typedef Head type;
};
</code></pre>
<p>Dein static_cast ist m.M.n. durchaus okay, aber normalerweise erbt man mit private und bietet eine friend-Funktion zum Zugriff an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105007</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 11 Aug 2011 18:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 18:56:38 GMT]]></title><description><![CDATA[<p>Danke 314159265358979!!!</p>
<p>Ich brauch zwar kein TypeAt, aber der Index sollte sich ähnlich verwirklichen lassen...</p>
<p>Welchen Vorteil hat die private Vererbung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105010</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 18:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 19:03:22 GMT]]></title><description><![CDATA[<p>Ich seh schon, das hab ich falsch verstanden. Du willst nicht den char als Typ, sondern du willst den char, der im Tuple ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>privat, da niemand den value kennen muss. get ist doch außerdem viel schöner für den Anwender. <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>Ich meld mich gleich mit einem get, das TypeAt verwendet. Muss mich da ein bisschen rumspielen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105014</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 11 Aug 2011 19:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 19:30:01 GMT]]></title><description><![CDATA[<p>So, es ist mir gelungen. Hier ist mein get <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<pre><code class="language-cpp">template &lt;int N&gt;
struct int_to_type {};

template &lt;typename Head, typename... Tail&gt;
Head&amp; get(tuple&lt;Head, Tail...&gt;&amp; tup, int_to_type&lt;0&gt;)
{
	return tup.value;
}

template &lt;int N, typename Head, typename... Tail&gt;
typename TypeAt&lt;N, Head, Tail...&gt;::type&amp; get(tuple&lt;Head, Tail...&gt;&amp; tup, int_to_type&lt;N&gt;)
{
	return get(static_cast&lt;tuple&lt;Tail...&gt;&amp;&gt;(tup), int_to_type&lt;N - 1&gt;());
}

template &lt;int N, typename Head, typename... Tail&gt;
typename TypeAt&lt;N, Head, Tail...&gt;::type&amp; get(tuple&lt;Head, Tail...&gt;&amp; tup)
{
	return get(static_cast&lt;tuple&lt;Tail...&gt;&amp;&gt;(tup), int_to_type&lt;N - 1&gt;());
};
</code></pre>
<p>Hier nochmal bei Ideone kompiliert: <a href="http://ideone.com/NPmNH" rel="nofollow">http://ideone.com/NPmNH</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105021</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 11 Aug 2011 19:30:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 19:53:16 GMT]]></title><description><![CDATA[<p>Falls es nicht nur ums Experimentieren geht: Es gibt <code>std::tuple</code> und <code>std::get()</code> aus dem Standardheader <code>&lt;tuple&gt;</code> . Tupel sind teilweise auch schon auf Compilern verfügbar, die keine Variadic Templates unterstützen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105030</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 11 Aug 2011 19:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 20:14:12 GMT]]></title><description><![CDATA[<p>Danke 314159265358979!!!<br />
Ich werd mir das jetzt nicht ankucken, damit ich es selbst noch versuchen kann <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>
<p>Nexus schrieb:</p>
<blockquote>
<p>Falls es nicht nur ums Experimentieren geht: Es gibt <code>std::tuple</code> und <code>std::get()</code> aus dem Standardheader <code>&lt;tuple&gt;</code> . Tupel sind teilweise auch schon auf Compilern verfügbar, die keine Variadic Templates unterstützen.</p>
</blockquote>
<p>Danke Nexus! Mir gehts ausschließlich ums Experimentieren <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/2105039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105039</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 20:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 22:37:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Falls es nicht nur ums Experimentieren geht: Es gibt <code>std::tuple</code> und <code>std::get()</code> aus dem Standardheader <code>&lt;tuple&gt;</code> . Tupel sind teilweise auch schon auf Compilern verfügbar, die keine Variadic Templates unterstützen.</p>
</blockquote>
<p>Wenn ich jetzt eine Lösung mit <code>std::tuple</code> verwirklichen möchte, wie krieg ich in einem Template dann analog zum TypeAt von 314159265358979 den Typen der entsprechenden Position heraus?</p>
<p>Klar kann ich in C++0x ein auto verwenden...<br />
Gibt es etwas Vorimplementiertes? Also eine eigene Lösung mit variadic templates würde ich wohl auch hinkriegen. Man soll ja das Rad nicht zweimal erfinden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105096</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:37:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 22:49:32 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Gibt es etwas Vorimplementiertes?</p>
</blockquote>
<p>Hab es selbst gefunden:<br />
<code>std::tuple_element</code></p>
<p>Kurzes Beispiel:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;tuple&gt;

int main(){
        typedef std::tuple&lt;int, char, double&gt; tuple_type;
        tuple_type t(1, 'c', 1.1);
        typedef typename std::tuple_element&lt;0,tuple_type&gt;::type tuple_type1;
        typedef typename std::tuple_element&lt;1,tuple_type&gt;::type tuple_type2;
        typedef typename std::tuple_element&lt;2,tuple_type&gt;::type tuple_type3;
        tuple_type1&amp; v1 = std::get&lt;0&gt;(t);
        tuple_type2&amp; v2 = std::get&lt;1&gt;(t);
        tuple_type3&amp; v3 = std::get&lt;2&gt;(t);
        v1 = 2;
        v2 = 'd';
        v3 = 1.2;
        std::cout &lt;&lt; std::get&lt;0&gt;(t) &lt;&lt; ' ' &lt;&lt; std::get&lt;1&gt;(t) &lt;&lt; ' ' &lt;&lt; std::get&lt;2&gt;(t) &lt;&lt; std::endl;
}
</code></pre>
<p>Danke trotzdem fürs Lesen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105106</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 22:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 23:00:11 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Wenn ich jetzt eine Lösung mit <code>std::tuple</code> verwirklichen möchte, wie krieg ich [...] den Typen der entsprechenden Position heraus?</p>
</blockquote>
<p><code>std::tuple_element</code> , siehe z.B. <a href="http://msdn.microsoft.com/en-us/library/ff926110.aspx" rel="nofollow">MSDN-Dokumentation</a>.</p>
<p>Edit: Hm, etwas zu spät. Aber was mir noch aufgefallen ist, in deinem Code ist das <code>typename</code> falsch. Die Templates sind ja alle vollständig instanziiert, also sind keine abhängigen Typen mehr im Spiel. Generell kann <code>typename</code> sich nie ausserhalb eines Templates befinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105107</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 11 Aug 2011 23:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf n-tes Element eines variadic tuple templates on Thu, 11 Aug 2011 23:09:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Wenn ich jetzt eine Lösung mit <code>std::tuple</code> verwirklichen möchte, wie krieg ich [...] den Typen der entsprechenden Position heraus?</p>
</blockquote>
<p><code>std::tuple_element</code> , siehe z.B. <a href="http://msdn.microsoft.com/en-us/library/ff926110.aspx" rel="nofollow">MSDN-Dokumentation</a>.</p>
</blockquote>
<p>Danke dir!<br />
Ich hatte nichts gefunden und nachdem ich gepostet habe, dann quasi sofort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105115</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Thu, 11 Aug 2011 23:09:16 GMT</pubDate></item></channel></rss>