<?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[template aus template]]></title><description><![CDATA[<p>Hey...</p>
<p>Geht so etwas in etwa?</p>
<pre><code class="language-cpp">#include &lt;deque&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

#include &lt;numeric&gt;

template &lt; typename TContainer&lt;typename T&gt; &gt;
T GetSum(const TContainer &amp;content)
{
	return std::accumulate(content.begin(), content.end(), T());
}

#include &lt;iostream&gt;

int main()
{
	std::vector&lt;int&gt; A(10, 2);
	std::deque&lt;int&gt; B(10, 2);
	std::list&lt;int&gt; C(10, 2);

	std::cout &lt;&lt; GetSum(A) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(B) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(C) &lt;&lt; std::endl;
}
</code></pre>
<p>Fehler werden logischerweise in der 7. Zeile angezeigt - ich war der Meinung, so ein Konstrukut hier im Forum schon irgendwann mal gesehen zu haben - leider weiß ich nicht mal mehr ansatzweise, in welchem Thread usw^^<br />
Ähnlich wie in diesem Bsp hier, steht auch in Wirklichkeit <code>T</code> fest, aber ich möchte mich eben nicht auf einen bestimmten Container festlegen...</p>
<p>Danke schon mal : &gt;</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249507/template-aus-template</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:57:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249507.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Sep 2009 13:30:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:30:25 GMT]]></title><description><![CDATA[<p>Hey...</p>
<p>Geht so etwas in etwa?</p>
<pre><code class="language-cpp">#include &lt;deque&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

#include &lt;numeric&gt;

template &lt; typename TContainer&lt;typename T&gt; &gt;
T GetSum(const TContainer &amp;content)
{
	return std::accumulate(content.begin(), content.end(), T());
}

#include &lt;iostream&gt;

int main()
{
	std::vector&lt;int&gt; A(10, 2);
	std::deque&lt;int&gt; B(10, 2);
	std::list&lt;int&gt; C(10, 2);

	std::cout &lt;&lt; GetSum(A) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(B) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(C) &lt;&lt; std::endl;
}
</code></pre>
<p>Fehler werden logischerweise in der 7. Zeile angezeigt - ich war der Meinung, so ein Konstrukut hier im Forum schon irgendwann mal gesehen zu haben - leider weiß ich nicht mal mehr ansatzweise, in welchem Thread usw^^<br />
Ähnlich wie in diesem Bsp hier, steht auch in Wirklichkeit <code>T</code> fest, aber ich möchte mich eben nicht auf einen bestimmten Container festlegen...</p>
<p>Danke schon mal : &gt;</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774587</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:32:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;template &lt;typename&gt; class TContainer, typename T&gt;
T GetSum(const TContainer&lt;T&gt; &amp;content)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1774593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774593</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:34:06 GMT]]></title><description><![CDATA[<p>Template-Templates funktionieren nur mit <code>class</code> , nicht mit <code>typename</code> . Die Syntax ist auch ein wenig anders:</p>
<pre><code class="language-cpp">template &lt;typename X&gt; class Y
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1774596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774596</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:40:12 GMT]]></title><description><![CDATA[<p>Danke : &gt;</p>
<p>Ich hab jz folgendes gemacht/machen müssen:</p>
<pre><code class="language-cpp">#include &lt;numeric&gt;

template&lt;typename T, typename S, template &lt;typename, typename&gt; class TContainer&gt;
T GetSum(const TContainer&lt;T, S&gt; &amp;content)
{
	return std::accumulate(content.begin(), content.end(), T());
}

#include &lt;iostream&gt;
#include &lt;deque&gt;
#include &lt;list&gt;
#include &lt;vector&gt;

int main()
{
	std::vector&lt;int&gt; A(10, 2);
	std::deque&lt;int&gt; B(10, 2);
	std::list&lt;int&gt; C(10, 2);

	std::cout &lt;&lt; GetSum(A) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(B) &lt;&lt; std::endl;
	std::cout &lt;&lt; GetSum(C) &lt;&lt; std::endl;
}
</code></pre>
<p>Als ich <code>Ryuzaki</code> s Code-Fragment per copy&amp;paste übernommen hatte, wollte er(MSVC) immer einen <code>allocator&lt;int&gt;</code> ausgeben und hat sich dann (logischerweise) beschwert, dass da kein op&lt;&lt; deklariert ist^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774603</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:43:48 GMT]]></title><description><![CDATA[<p>unskilled @logged-off schrieb:</p>
<blockquote>
<p>Hey...</p>
<p>Geht so etwas in etwa? [...]</p>
</blockquote>
<p>Jein.</p>
<p>Was du vermutlich suchst ist folgendes:</p>
<pre><code class="language-cpp">template &lt;class T, template &lt;class&gt; class Container &gt;
T GetSum(const Container&lt;T&gt; &amp;content)
{
	return std::accumulate(content.begin(), content.end(), T());
}
</code></pre>
<p>Problem ist allerdings folgendes:<br />
- du musst beim Template-template parameter (also das was ich hier &quot;Container&quot; genannt hab) <em>alle</em> Templateparameter mit angeben. std::vector z.B. hat mindestens noch den Allokator als zweiten Parameter. Damit hieße das dann z.B.</p>
<pre><code class="language-cpp">template &lt;class T, class A, template &lt;class, class&gt; class Container &gt;
T GetSum(const Container&lt;T,A&gt; &amp;content)
{
	return std::accumulate(content.begin(), content.end(), T());
}
</code></pre>
<p>Damit ist die Behandlung gleich eingeschränkt, denn damit muss jeder Container mit dem du die Funktion benutzen willst, genau zwei Templateparameter haben. Damit wären wir beim nächsten Thema und einer der Unschönheiten im C++-Standard: die Standardcontainer sind nicht verpflichtet, nur genau die vorgeschriebenen Templateparameter zu haben, der Standard überlässt der Implementierung die Möglichkeit, noch zusätzliche Templateparameter zu definieren. Ein std::vector könnte also durchaus als<br />
`template &lt;class T, class Alloc, class Horst, class Wurstbrot, int barfuss&gt;</p>
<p>class vector;` definiert sein. Und der passt natürlich wieder nicht auf den template-templateparameter. Ich würde sowas daher eher wie folgt machen:</p>
<pre><code class="language-cpp">template &lt;class Container&gt;
typename Container::value_type GetSum(Container const&amp; cont);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1774609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774609</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 13:51:19 GMT]]></title><description><![CDATA[<p>hmm.. das ist ja doof^^</p>
<p>naja - das thema mit &quot;der standard schreibt die anzahl der template-parameter nicht vor&quot; hatten wir schon mal und waren recht gespaltener Meinung dazu.</p>
<p>Naja, dann fällt halt die Überprüfung für den value_type weg, da man mit StaticAssert und typeid ja nicht all zu viel anfangen kann...<br />
ist auch nicht so wichtig.</p>
<p>Danke : &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774616</guid><dc:creator><![CDATA[unskilled @logged-off]]></dc:creator><pubDate>Tue, 08 Sep 2009 13:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 14:05:53 GMT]]></title><description><![CDATA[<p>unskilled @logged-off schrieb:</p>
<blockquote>
<p>naja - das thema mit &quot;der standard schreibt die anzahl der template-parameter nicht vor&quot; hatten wir schon mal und waren recht gespaltener Meinung dazu.</p>
</blockquote>
<p>Naja. Er schreibts eben nicht vor. Das ist keine Meinung sondern Tatsache <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="😉"
    /> Wie viele Bibliotheksimplementierungen das dann ausnutzen und tatsächlich weitere Parameter einführen steht auf einem anderen Blatt und war IIRC der strittige Bestandteil der Diskussion.</p>
<blockquote>
<p>Naja, dann fällt halt die Überprüfung für den value_type weg, da man mit StaticAssert und typeid ja nicht all zu viel anfangen kann...<br />
ist auch nicht so wichtig.</p>
</blockquote>
<p>Was für eine Überprüfung denn? Kann man sicher trotzdem noch einbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774629</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Sep 2009 14:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 14:15:53 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>[...] die Standardcontainer sind nicht verpflichtet, nur genau die vorgeschriebenen Templateparameter zu haben, der Standard überlässt der Implementierung die Möglichkeit, noch zusätzliche Templateparameter zu definieren.</p>
</blockquote>
<p>Da gab es ja neulich eine große <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-245351-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html" rel="nofollow">&quot;Interpretations-Debatte&quot;</a> zu dem Thema. Wenn man sich den Beitrag von Old McDonald anschaut, findet man den Link zu <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94</a> in der genau das diskutiert wird.</p>
<p>edit:</p>
<p>Allerdings kann ich dem Text <em>auch nicht</em> ganz entnehmen, wie es gemeint war, was die neue Intention ist und was C++0x daraus macht.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774630</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 08 Sep 2009 14:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 14:11:25 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Da gab es ja neulich eine große <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-245351-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html" rel="nofollow">&quot;Interpretations-Debatte&quot;</a> zu dem Thema. Wenn man sich den Beitrag von Old McDonald anschaut, findet man den Link zu <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#94</a> in der genau das diskutiert wird. Fazit: Eine Standardbibliothek, die zusätzliche default-Template-Parameter für Klassen benutzt ist nicht standardkonform.</p>
</blockquote>
<p>Gut zu wissen. Das macht die Situation allerdings für unskilled's GetSum nicht viel besser, zumal std::set auf jeden Fall drei Parameter hat und selbstgestrickte Container nicht unbedingt mehr als einen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774634</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Sep 2009 14:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 14:18:45 GMT]]></title><description><![CDATA[<p>Deswegen gibt es auch so Tricks wie &quot;rebind&quot; bei Allokatoren.</p>
<p>btw: Ich habe meinen vorherigen Beitrag editiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774637</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 08 Sep 2009 14:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Tue, 08 Sep 2009 14:23:20 GMT]]></title><description><![CDATA[<p>Im Allgemeinen ist es keine gute Idee, sich von der Struktur der Templateparmeter abhängig zu machen, schon aus theoretischen Gründen, weil diese Struktur nichts mit der Funktionalität zu tun hat, die die Funktion vom übergebenen Argument erwartet. Zudem existieren - nicht nur aber auch - aus diesem Grund die Membertypen value_type&amp;co. Die obige Beispielfunktion könnte und sollte also ohne weiteres so geschrieben werden</p>
<pre><code class="language-cpp">template &lt;class Container&gt;
typename Container::value_type GetSum(const Container&amp; content)
{
    return std::accumulate(content.begin(), content.end(), typename Container::value_type());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1774641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774641</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 08 Sep 2009 14:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to template aus template on Mon, 14 Sep 2009 20:35:51 GMT]]></title><description><![CDATA[<p>edit...<br />
ok, das hier wollte ich btw:</p>
<pre><code class="language-cpp">template &lt;
	typename TChar,
	typename TTraits  = std::char_traits&lt; TChar &gt;,
	typename TAlloc   = std::allocator&lt; typename TTraits::char_type &gt;,
	template &lt;
		typename, typename
	&gt; class TArray    = std::deque
&gt;
class basic_string
{};
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778333</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Sep 2009 20:35:51 GMT</pubDate></item></channel></rss>