<?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[container-typ als template parameter]]></title><description><![CDATA[<p>hi leute</p>
<p>wie funktioniert es das ich ne list oder einen vector als template parameter uebergebe ? also den container-typ an sich</p>
<p>sowas:</p>
<pre><code class="language-cpp">template&lt;typename CONTAINER, class T&gt;
class myclass
{
   typedef CONTAINER&lt;wrapper&lt;T&gt; &gt; container; // wrapper is ne klasse die nur intern verwendet wird
};
</code></pre>
<p>gibts da ne moeglichkeit ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307760/container-typ-als-template-parameter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 09:02:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307760.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Sep 2012 20:34:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to container-typ als template parameter on Tue, 04 Sep 2012 20:35:32 GMT]]></title><description><![CDATA[<p>hi leute</p>
<p>wie funktioniert es das ich ne list oder einen vector als template parameter uebergebe ? also den container-typ an sich</p>
<p>sowas:</p>
<pre><code class="language-cpp">template&lt;typename CONTAINER, class T&gt;
class myclass
{
   typedef CONTAINER&lt;wrapper&lt;T&gt; &gt; container; // wrapper is ne klasse die nur intern verwendet wird
};
</code></pre>
<p>gibts da ne moeglichkeit ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248517</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Tue, 04 Sep 2012 20:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Tue, 04 Sep 2012 20:53:46 GMT]]></title><description><![CDATA[<p>Prinzipiell geht das so:</p>
<pre><code class="language-cpp">template &lt;template&lt;class&gt; class Container&gt;
class myclass {
  Container&lt;int&gt; container;
};
</code></pre>
<p>Wenn du std::vector verwenden willst, musst du allerdings beachten, dass dieser zwei Template-Argumente entgegennimmt.</p>
<pre><code class="language-cpp">template &lt;template&lt;class, class&gt; class Container&gt;
class myclass {
  Container&lt;int, std::allocator&lt;int&gt; &gt; container;
};
</code></pre>
<p>BTW: Man darf zwar schreiben <code>template&lt;typename,typename&gt;class Container</code> , aber das letzte <code>class</code> muss ein <code>class</code> bleiben. Frag mich nicht warum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248519</guid><dc:creator><![CDATA[templatetemplatetemplate]]></dc:creator><pubDate>Tue, 04 Sep 2012 20:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Wed, 05 Sep 2012 05:38:54 GMT]]></title><description><![CDATA[<p>templatetemplatetemplate schrieb:</p>
<blockquote>
<p>Wenn du std::vector verwenden willst, musst du allerdings beachten, dass dieser zwei Template-Argumente entgegennimmt.</p>
</blockquote>
<p>Oder drei, oder vier. Garantiert ist IIRC nur, dass die ersten beiden Parameter Elementtyp und Allokator sind, Implementierungen dürfen aber noch zusätzliche Parameter definieren - durften sie AFAIK zumindest im alten Standard.<br />
Davon abgesehen wird mit den zwei Parametern z.B. das std::Set diskriminiert, das auf jeden Fall drei Parameter hat (Key, Comparator, Allokator)</p>
<p>templatetemplatetemplate schrieb:</p>
<blockquote>
<p>aber das letzte <code>class</code> muss ein <code>class</code> bleiben. Frag mich nicht warum.</p>
</blockquote>
<p>Weil der Container eine Klasse(/struct) sein muss, die Templateparameter können sowohl Klassen als auch andere Typen sein.</p>
<p>@Meepmeep: was willst du <em>erreichen</em>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248541</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 05 Sep 2012 05:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Wed, 05 Sep 2012 06:29:10 GMT]]></title><description><![CDATA[<p>Die beiden folgenden Klassen Templates sind doch äquivalent (typename / class spielt keine Rolle), oder?</p>
<pre><code class="language-cpp">template &lt;typename A&gt;
class B {};
</code></pre>
<pre><code class="language-cpp">template &lt;class A&gt;
class B {};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2248548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248548</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 05 Sep 2012 06:29:10 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Wed, 05 Sep 2012 06:48:39 GMT]]></title><description><![CDATA[<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248552</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 05 Sep 2012 06:48:39 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Wed, 05 Sep 2012 07:02:08 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>templatetemplatetemplate schrieb:</p>
<blockquote>
<p>Wenn du std::vector verwenden willst, musst du allerdings beachten, dass dieser zwei Template-Argumente entgegennimmt.</p>
</blockquote>
<p>Oder drei, oder vier. Garantiert ist IIRC nur, dass die ersten beiden Parameter Elementtyp und Allokator sind, Implementierungen dürfen aber noch zusätzliche Parameter definieren - durften sie AFAIK zumindest im alten Standard.</p>
</blockquote>
<p>Das war <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94" rel="nofollow">noch nie</a> erlaubt. Sofern kern Bedarf besteht, mit veralteten, fehlerhaften Compilern/Standardbibliotheken zu arbeiten, muss auf diese Problematik keine Rücksicht genommen werden.</p>
<pre><code class="language-cpp">template &lt;typename C&gt; struct wrapped_container;
template &lt;template &lt;typename, typename&gt; class TT, typename T, typename A&gt;
struct wrapped_container&lt;TT&lt;T, A&gt;&gt;
{
     // sanity checks
     typedef TT&lt;T, A&gt; C;
     static_assert(std::is_same&lt;T, typename C::value_type&gt;::value);
     static_assert(std::is_same&lt;T, typename A::value_type&gt;::value);
     static_assert(std::is_same&lt;A, typename C::allocator_type&gt;::value);

     typedef TT&lt;wrapped&lt;T&gt;, typename A::template rebind&lt;wrapped&lt;T&gt;&gt;::other&gt; type;
};
template &lt;typename T, std::size_t N&gt;
struct wrapped_container&lt;std::array&lt;T, N&gt;&gt;
{
     typedef std::array&lt;wrapped&lt;T&gt;, N&gt; type;
};

template &lt;typename Container&gt;
class myclass {
  typedef typename wrapped_container&lt;C&gt;::type container_type;
  container_type container;
};
</code></pre>
<p>lässt sich belieb auf andere Container erweitern, wenn man ggf. entsprechende Wrapper für KeyComp, Hash etc. bereitstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248555</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Sep 2012 07:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Thu, 06 Sep 2012 04:58:44 GMT]]></title><description><![CDATA[<p>hi</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
koenntest du mir erklaeren was genau du da gemacht hast ? ich glaub meine template kenntnisse sind eingerostet bzw. nicht gut genug.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
ich bau mir zur zeit eine kleine bibliothek zur verwaltung von knotenpunkten die aehnlich wie ein dateisystem mehrere ebenen haben koennen. jeh nach anwendungsfall soll sie intern mit einem vektor bzw. mit einer liste arbeiten.</p>
<p>wenn ich nun jedoch deine multimap verwenden moechte hab ich natuerlich das problem mit der anzahl der templateparameter. was mir derzeit egal ist.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
koennte ich nach deinem konstrukt auch eine multimap verwenden ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248903</guid><dc:creator><![CDATA[Meep Meep @ Balkonien]]></dc:creator><pubDate>Thu, 06 Sep 2012 04:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to container-typ als template parameter on Thu, 06 Sep 2012 17:23:31 GMT]]></title><description><![CDATA[<p>Meep Meep @ Balkonien schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
koenntest du mir erklaeren was genau du da gemacht hast ? ich glaub meine template kenntnisse sind eingerostet bzw. nicht gut genug.</p>
</blockquote>
<p>Ich habe erst mal dein Template-Argument T entfernt, das ist redudant, wenn ein anderer Templateparamter einen Container mit diesem Value-typ beshreiben soll. Ansonst ist das eine einfache Angelegenheit, falls der Container eine Instanz eines Templates mit zwei Typparametern (bei Standardcontainern wären das vector, deque, list, forward_list) ist, wird die erste Spezialisierung genommen. Ein paar zusätzlich Checks sind nur dafür da, offensichtliche Nicht-Container abzufangen, um eine klarere Fehlermeldung zu erhalten.</p>
<p>Meep Meep @ Balkonien schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
koennte ich nach deinem konstrukt auch eine multimap verwenden ?</p>
</blockquote>
<p>Klar. Indem eine entsprechende Spezialisierung geschrieben wirde. Zu beachten ist hierbei, dass ggf. das Compare-argument modifiziert werden muss. Das hängt davon ab, was gewrapped werden soll (Der Key oder der Valuetyp oder beides - nicht gewrapped werden kann allerdings das resultierende pair).<br />
z.B.</p>
<pre><code class="language-cpp">template &lt;template &lt;typename, typename, typename, typename&gt; class TT, typename Key, typename T, typename Comp, typename A&gt; // map, multimap
struct ordered_wrapped_container4
{
    struct new_comp : Comp
    {
        bool operator()(const wrapped&lt;Key&gt;&amp; lhs, const wrapped&lt;Key&gt;&amp; rhs) const { return Comp::operator()( unwrap( lhs ), unwrap( rhs ) ); }
    };
    typedef TT&lt;wrapped&lt;Key&gt;, T, new_comp, typename A::template rebind&lt;std::pair&lt;const wrapped&lt;Key&gt;, T&gt;&gt;::other&gt; type;
};

template &lt;template &lt;typename, typename, typename, typename&gt; class TT, typename Key, typename Hash, typename Pred, typename A&gt; // unordered_set, unordered_multiset
struct unordered_wrapped_container4; // todo

template &lt;template &lt;typename, typename, typename, typename&gt; class TT, typename A, typename B, typename C, typename D&gt; // 4 Typargumente: erwischt map, multimap, unordered_set, unordered_multiset
struct wrapped_container&lt;TT&lt;A, B, C, D&gt;&gt; : std::conditional&lt;std::is_same&lt;A, typename TT&lt;A, B, C, D&gt;::value_type&gt;::value, unordered_wrapped_container4&lt;TT, A, B, C, D&gt;, ordered_wrapped_container4&lt;TT, A, B, C, D&gt;&gt;::type
{};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2249215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249215</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 06 Sep 2012 17:23:31 GMT</pubDate></item></channel></rss>