<?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[Partielle Template-Spezialisierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Ziel ist es, eine Ausgabemethode für sämtliche STL-Container anzubieten. Da diese aber unterschiedlich zu handhaben sind, versuche ich die Unterschiede in einzelne Template-Spezialisierungen aufzugliedern. Aber seht selbst:</p>
<p>Ausgabe-Funktion:</p>
<pre><code class="language-cpp">template&lt;typename Container&gt;
void print_container(const Container&amp; container)
{
	print_functor&lt;typename Container::value_type, Container&gt; a_print_functor;
	std::for_each(container.begin(), container.end(), a_print_functor);
}
</code></pre>
<p>Implementierung für vector, list, deque, set und multiset:</p>
<pre><code class="language-cpp">template&lt;typename Elem_Type, typename Container&gt;
struct print_functor : public std::unary_function&lt;Elem_Type, void&gt;
{
	void operator()(const Elem_Type&amp; el)
	{
		std::cout &lt;&lt; el &lt;&lt; '\n';
	}
};
</code></pre>
<p>Eine der Spezialisierungen, in diesem Fall für map und multimap:</p>
<pre><code class="language-cpp">template&lt;typename Elem_Type&gt;
struct print_functor&lt;Elem_Type, std::map&lt;Elem_Type&gt; &gt; : public std::unary_function&lt;Elem_Type, void&gt;
{
	void operator()(const Elem_Type&amp; el)
	{
		std::cout &lt;&lt; el.first &lt;&lt; &quot;\t\t&quot; &lt;&lt; el.second &lt;&lt; '\n';		
	}
};
</code></pre>
<p>Schätze mal, das ist ein Fehler syntaktischer Art. Wäre nett, wenn mich einer aufklären könnte <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/topic/245351/partielle-template-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 06:47:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245351.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Jul 2009 06:35:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 06:36:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mein Ziel ist es, eine Ausgabemethode für sämtliche STL-Container anzubieten. Da diese aber unterschiedlich zu handhaben sind, versuche ich die Unterschiede in einzelne Template-Spezialisierungen aufzugliedern. Aber seht selbst:</p>
<p>Ausgabe-Funktion:</p>
<pre><code class="language-cpp">template&lt;typename Container&gt;
void print_container(const Container&amp; container)
{
	print_functor&lt;typename Container::value_type, Container&gt; a_print_functor;
	std::for_each(container.begin(), container.end(), a_print_functor);
}
</code></pre>
<p>Implementierung für vector, list, deque, set und multiset:</p>
<pre><code class="language-cpp">template&lt;typename Elem_Type, typename Container&gt;
struct print_functor : public std::unary_function&lt;Elem_Type, void&gt;
{
	void operator()(const Elem_Type&amp; el)
	{
		std::cout &lt;&lt; el &lt;&lt; '\n';
	}
};
</code></pre>
<p>Eine der Spezialisierungen, in diesem Fall für map und multimap:</p>
<pre><code class="language-cpp">template&lt;typename Elem_Type&gt;
struct print_functor&lt;Elem_Type, std::map&lt;Elem_Type&gt; &gt; : public std::unary_function&lt;Elem_Type, void&gt;
{
	void operator()(const Elem_Type&amp; el)
	{
		std::cout &lt;&lt; el.first &lt;&lt; &quot;\t\t&quot; &lt;&lt; el.second &lt;&lt; '\n';		
	}
};
</code></pre>
<p>Schätze mal, das ist ein Fehler syntaktischer Art. Wäre nett, wenn mich einer aufklären könnte <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/1741871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741871</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 13 Jul 2009 06:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 07:23:10 GMT]]></title><description><![CDATA[<p>Ich seh keine Fehlermeldung - was bekommst du denn da?</p>
<p>Siehe auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html" rel="nofollow">hier</a>, vierter Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741890</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 13 Jul 2009 07:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 09:22:29 GMT]]></title><description><![CDATA[<p>std::map&lt;Elem_Type&gt; &gt;</p>
<p>funktioniert sowieso schon mal nicht, map benötigt Key-Value-Paare. Deswegen komiliert der Funktor so wie implementiert auch nicht, da er das nicht berücksichtigt. Die Spezialisierung musst Du schon eine Ebene höher machen, da die for_each Schleife für map wegen der Key-Value-Paare schon anders aussehen muss (Hinweis: select2nd)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1741954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1741954</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Mon, 13 Jul 2009 09:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 13:04:26 GMT]]></title><description><![CDATA[<p>Verflixt, hab doch glatt die Fehlermeldung unterschlagen. Die hatte ich noch in der Zwischenablage. War wohl doch schon ein bisschen früh...</p>
<p>Der Fehler:</p>
<blockquote>
<p>../src/print_container.hpp:35: error: wrong number of template arguments (1, should be 4)<br />
stl_map.h:92: error: provided for `template&lt;_Key, _Tp, _Compare, _Alloc&gt; map'<br />
../src/print_container.hpp:35: error: template argument 2 is invalid</p>
</blockquote>
<p>Zeile 35 entspricht Zeile 2 im letzten Codeausschnitt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9007">@jencas</a>: Verbesser mich, falls ich falsch liegen sollte, aber ich glaube verstanden zu haben, was das grundsätzliche Problem ist... Dass der Funktor nur instanziiert werden kann, wenn der Elementtyp des Containers nicht auch wieder von Template-Parametern abhängt. Also, funktioniert ein vector&lt;int&gt; bspw. problemlos, weil der Funktor hier mit dem Containertyp und Elementtyp instanziiert werden kann. Wenn der Elementtyp jedoch ein Paar ist, wie bei map&lt;pair&lt;string, int&gt;&gt;, ist dieses Paar ja praktisch auch wieder ein eigener Container, dessen Elementtyp man dann auch an den Funktor übergeben müsste.</p>
<p>Soweit richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742101</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 13 Jul 2009 13:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 13:13:19 GMT]]></title><description><![CDATA[<p>moagnus schrieb:</p>
<blockquote>
<p>map&lt;pair&lt;string, int&gt;&gt;</p>
</blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/map/" rel="nofollow">http://www.cplusplus.com/reference/stl/map/</a><br />
--&gt;</p>
<pre><code class="language-cpp">template &lt; class Key, class T, class Compare = less&lt;Key&gt;,
           class Allocator = allocator&lt;pair&lt;const Key,T&gt; &gt; &gt; class map;
</code></pre>
<p><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/1742111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742111</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 13 Jul 2009 13:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 13:49:51 GMT]]></title><description><![CDATA[<p>Ok, dass ein map&lt;pair&lt;..., ...&gt;&gt; nicht funktioniert hab ich jetzt kapiert.<br />
Aber was ich nicht kapiere:<br />
Wenn ich mir eine eigene Funktion schreiben will, die in for_each für jedes Element aufgerufen wird, dann muss die Funktion einen Parameter vom Typ der Elemente nehmen, oder? Also bei for_each für vector&lt;int&gt; ist die Signatur &quot;void f(int i)&quot;. Aber wie sieht sowas bei map aus? Müsste die Funktion nicht auch einfach map::value_type als Parametertyp nehmen, was dann doch pair&lt;Key, T&gt; wäre?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742139</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 13 Jul 2009 13:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 14:33:17 GMT]]></title><description><![CDATA[<p>Ja, <code>value_type</code> gibt den Elementtypen an. Das stimmt schon, aber du musst dein Template richtig spezialisieren (also nicht mit <code>std::map&lt;ElemType&gt;</code> ). Alternativ kannst du auch den <code>operator&lt;&lt;</code> für <code>std::pair</code> überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742167</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 13 Jul 2009 14:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 14:56:44 GMT]]></title><description><![CDATA[<p>So in etwa sähe das von dir beabsichtigte aus:</p>
<pre><code class="language-cpp">template&lt;typename Key_Type, typename Mapped_Type, typename Compare,  typename Allocator&gt;
struct print_functor&lt;typename std::map&lt;Key_Type, Mapped_Type, Compare, Allocator&gt;::value_type,  std::map&lt;Key_Type, Mapped_Type&gt; &gt; 
   : public std::unary_function&lt;typename std::map&lt;Key_Type, Mapped_Type, , Allocator&gt;::value_type, void&gt;
{
private: 
  typedef typename std::map&lt;Key_Type, Mapped_Type, Compare, Allocator&gt;::value_type value_type;
public:
    void operator()(const value_type&amp; el)
    {
        std::cout &lt;&lt; el.first &lt;&lt; &quot;\t\t&quot; &lt;&lt; el.second &lt;&lt; '\n';       
    }
};
</code></pre>
<p>Allerdings gibts eines zu beachten:<br />
Der Standard schreibt nicht vor, dass std::map nur diese vier Template-Parameter hat. Sollte es noch mehr geben, dann funktioniert diese Spezialisierung nicht. Diese implementierung ist also nicht unbedingt portabel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742186</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 13 Jul 2009 14:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 15:00:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename ContainerT&gt; // Container reicht bei weitem
struct print_functor
    : public std::unary_function&lt;typename ContainerT::value_type, void&gt;
{
    void operator()(const typename ContainerT::value_type&amp; el)
    {
        std::cout &lt;&lt; el &lt;&lt; '\n';
    }
};

template&lt;typename K, typename V, typename C, typename A&gt;
struct print_functor&lt;std::map&lt;K, V, C, A&gt; &gt;
    : public std::unary_function&lt;std::pair&lt;K const, V&gt;, void&gt;
{
    void operator ()(std::pair&lt;K const, V&gt; const&amp; el)
    {
        std::cout &lt;&lt; el.first &lt;&lt; &quot;\t\t&quot; &lt;&lt; el.second &lt;&lt; '\n';
    }
};

// ...
template&lt;typename ContainerT&gt;
void print_container(const ContainerT&amp; container)
{
    print_functor&lt;ContainerT&gt; a_print_functor;
    std::for_each(container.begin(), container.end(), a_print_functor);
}
</code></pre>
<p>Dies dürfte eigentlich reichen und funktionieren. Auch können hier <code>std::map</code> verarbeitet werden, welche einen anderen Vergleich- oder Allokatortyp haben.</p>
<p>Allerdings ist es nicht 100% portabel, da der Standard nicht garantiert, dass <code>std::map</code> nur 4 Templateparameter hat. Bei den meisten Standardbibliotheken ist dies allerdings so. Mir ist nicht mal eine bekannt, wo dies nicht der Fall ist.</p>
<p>Edit: Da war pumuckl zum Teil etwas schneller <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742187</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 15:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 15:43:21 GMT]]></title><description><![CDATA[<p>Tausend Dank euch, Jungs! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Das Problem, vor dem ich jetzt aber stehe, ist die Frage, wie ich den Funktor instanziieren soll.<br />
Am liebsten wäre mir eine einheitliche Schnittstelle, d. h., print_container() soll für alle Container gleich aufgerufen werden können. Weil sich der Funktionsrumpf von print_container() abhängig vom Container aber unterscheidet, gibts dann Mehrfachdefinitionen.</p>
<p>Vermutlich stell ich mich da einfach nur extrem ungeschickt an; ich hantiere aber erst seit kürzerem mit Templates und finde das teilweise noch etwas verzwickt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742238</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Mon, 13 Jul 2009 15:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 15:54:28 GMT]]></title><description><![CDATA[<p>Wo steht denn, dass eine map nicht genau 4 template-parameter haben muss?</p>
<p>C++ Standard - 23.3.1 Template class map schrieb:</p>
<blockquote>
<ul>
<li><em>1</em> A map is a kind of associative container that supports unique keys (contains at most one of each key value) and provides for fast retrieval of values of another type T based on the keys. Map supports bidirectional iterators.</li>
<li><em>2</em> A map satisfies all of the requirements of a container and of a reversible container (23.1) and of an associative container (23.1.2). A map also provides most operations described in (23.1.2) for unique keys. This means that a map supports the a_uniq operations in (23.1.2) but not the a_eq operations.<br />
For a map&lt;Key,T&gt; the key_type is Key and the value_type is pair&lt;const Key,T&gt;. Descriptions are provided here only for operations on map that are not described in one of those tables or for operations where there is additional semantic information.</li>
</ul>
<pre><code class="language-cpp">namespace std {
  template &lt;
      class Key,
      class T,
      class Compare = less&lt;Key&gt;,
      class Allocator = allocator&lt;
          pair&lt;const Key,T&gt;
      &gt;
  &gt; class map;
</code></pre>
</blockquote>
<p>Woraus schließt ihr diese Aussage also?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742245</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 13 Jul 2009 15:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 17:45:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16525">@moagnus</a>,<br />
Verstehe dein Problem nicht. Du kannst das Funktionstemplate <code>print_container</code> nehmen, welches ich im Code hingeschrieben habe. Da gibt es keine Mehrfachdefinition, ausser du machst etwas gehörig falsch, so falsch, dass ich es mir gar nicht vorstellen kann und daher keine Idee habe, was du falsch gemacht haben könntest <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>,<br />
Wir schliessen es aus der einfachen Tatsache, dass nirgends im Standard steht, dass <code>std::map</code> nicht auch noch zusätzliche Templateparemeter mit Defaultparametern haben darf. Es steht eben nichts drin <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742293</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 17:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 18:42:47 GMT]]></title><description><![CDATA[<p>imho ist der aufbau damit explizit gegeben - aber ok, wenn das sonst drin stehen müsste, habt ihr wohl recht ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742329</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 13 Jul 2009 18:42:47 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 19:20:55 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>,<br />
Wir schliessen es aus der einfachen Tatsache, dass nirgends im Standard steht, dass <code>std::map</code> nicht auch noch zusätzliche Templateparemeter mit Defaultparametern haben darf. Es steht eben nichts drin <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>
</blockquote>
<p>Das sehe ich nicht so. Wenn dort die <em>Deklaration</em> des Templates unmissverständlich mit</p>
<pre><code class="language-cpp">template&lt;class Key, class T, class Compare = less&lt;Key&gt;,
         class Allocator = allocator&lt;pair&lt;const Key, T&gt; &gt; &gt;
  class map;
</code></pre>
<p>beschrieben wird, gehe ich davon aus, dass eine Implementierung sich daran zu halten hat. Die &quot;as-if&quot;-Regel wäre bei anderen Deklarationen, die weitere Default-Parameter besitzen, auch verletzt.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742353</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 19:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 19:36:56 GMT]]></title><description><![CDATA[<p>Als Alternative zu den Funktoren, bei denen bereits der Typ drei Zeilen Code braucht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void output_element(const T&amp; value)
{
	std::cout &lt;&lt; value &lt;&lt; std::endl;
}

template &lt;typename First, typename Second&gt;
void output_element(const std::pair&lt;First, Second&gt;&amp; pair)
{
	std::cout &lt;&lt; pair.first &lt;&lt; &quot; &quot; &lt;&lt; pair.second &lt;&lt; std::endl;
}

template &lt;typename Container&gt;
void output_container(const Container&amp; c)
{
	for (Container::const_iterator iter = c.begin(), end = c.end(); iter != end; ++iter)
	{
		output_element(*iter);
	}
}
</code></pre>
<p>Oder wie gesagt den <code>operator&lt;&lt;</code> für <code>std::pair</code> überladen (vielleicht braucht man das ja gerade sonst irgendwo), dann reicht eine Element-Ausgabefunktion und man kann mit <code>std::for_each()</code> arbeiten. Hey, jeweils nur eine Zeile pro Funktion, und keine Verschmutzung durch etliche <code>typename</code> s. <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">template &lt;typename First, typename Second&gt;
std::ostream&amp; operator&lt;&lt; (std::ostream&amp; stream, const std::pair&lt;First, Second&gt;&amp; pair)
{
	return stream &lt;&lt; pair.first &lt;&lt; &quot; &quot; &lt;&lt; pair.second;
}

template &lt;typename T&gt;
void output_element(const T&amp; value)
{
	std::cout &lt;&lt; value &lt;&lt; std::endl;
}

template &lt;typename Container&gt;
void output_container(const Container&amp; c)
{
	std::for_each(c.begin(), c.end(), output_element&lt;Container::value_type&gt;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1742364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742364</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 13 Jul 2009 19:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 19:43:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36159">@Sebastian</a> Pizer,<br />
Lies mal Kapitel 1.4 (Implementation compliance) des Standards. Dort steht, dass diese Beispiele nur teilweise Definitionen sind und dass eine Bibliothek diese Beispielimplementationen auch erweitern darf, sofern das Programm durch die Veränderungen mit der gezeigen Form im Standard trotzdem korrekt ist. Deshalb müssen die zusätzlichen Templateparameter auch Defaultparameter haben, sonst würden sie dagegen verstossen.</p>
<p>Edit: Kapitelname noch eingefügt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742367</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 19:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 20:08:12 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>... Deshalb müssen die zusätzlichen Templateparameter auch Defaultparameter haben, sonst würden sie dagegen verstossen.</p>
</blockquote>
<p>&quot;dagegen&quot;? Wogegen denn genau?<br />
Ich kann Kapitel 1.4 nichts entnehmen, was mit Deiner Interpretation vereinbar ist.</p>
<p>Bzgl Klassen und Klassen-Templates steht da</p>
<blockquote>
<p>For classes and class templates, the library clauses specify partial definitions. Private members (clause 11) are not specified, but each implementation shall supply them to complete the definitions according to the description in the library clauses.</p>
</blockquote>
<p>Dass dort keine kompletten <em>Definitionen</em> spezifiziert sind, ist klar. Aber wenn ich eine <em>Deklaration</em> eines Klassentemplates ohne irgendwelche in kursiv gesetzte Platzhalter oder Bemerkungen sehe, ist das für mich eine Deklaration, an der nicht gerüttelt werden darf.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742378</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 20:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 20:15:06 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>[...]wenn ich eine <em>Deklaration</em> eines Klassentemplates ohne irgendwelche in kursiv gesetzte Platzhalter oder Bemerkungen sehe, ist das für mich eine Deklaration, an der nicht gerüttelt werden darf.</p>
</blockquote>
<p>So seh ich das auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742382</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 13 Jul 2009 20:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 20:35:41 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36159">@Sebastian</a> Pizer,<br />
Was du machst ist eine eigenständige Interpretation, es steht aber nicht so im Standard und es müsste explizit stehen, damit es so ist. Denn im Standard wird alles genau festgelegt. Um deine Behauptung also zu beweisen, musst du mir im Standard zeigen, wo steht, dass die Implementation sich 1:1 an diese Codebeispiele zu halten haben. Vor allem in diesem Punkt in Bezug auf Templateparametern.</p>
<p>Zusätzlich steht übrigens auch im Kapitel 1.4:</p>
<blockquote>
<p>A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any well-formed program. Implementations are required to diagnose programs that use such extensions that are ill-formed according to this International Standard. Having done so, however, they can compile and execute such programs.</p>
</blockquote>
<p>Es dürfen Erweiterungen existieren. Das Programm muss einfach nur <em>well-formed</em> bleiben. Es steht im Standard, dass <code>std::map</code> 4 Templateparameter haben soll. Man muss also schreiben dürfen: <code>std::map&lt;A, B, C, D&gt;</code> .<br />
Dies verbietet allerdings nicht eine solche Deklaration:</p>
<pre><code class="language-cpp">template
&lt;
  typename A,
  typename B,
  typename C = std::less&lt;A&gt;,
  typename D = std::allocator&lt;std::pair&lt;A const, B&gt; &gt;,
  typename X = int /*,
  ... */
&gt;
class map
{
  // ...
};
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742394</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 20:35:41 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 20:47:43 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Es dürfen Erweiterungen existieren. Das Programm muss einfach nur <em>well-formed</em> bleiben. Es steht im Standard, dass <code>std::map</code> 4 Templateparameter haben soll. Man muss also schreiben dürfen: <code>std::map&lt;A, B, C, D&gt;</code> .</p>
</blockquote>
<p>Sagt wer?<br />
Ist das hier auch well-formed?</p>
<pre><code class="language-cpp">#include &lt;map&gt;
template&lt;template&lt;class,class,class,class&gt; class Foo&gt;
struct blupp {};
int main()
{
  blupp&lt;std::map&gt; x;
}
</code></pre>
<p>Wo ziehst Du denn da die Grenze?</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742406</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 20:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 21:13:28 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Es dürfen Erweiterungen existieren. Das Programm muss einfach nur <em>well-formed</em> bleiben. Es steht im Standard, dass <code>std::map</code> 4 Templateparameter haben soll. Man muss also schreiben dürfen: <code>std::map&lt;A, B, C, D&gt;</code> .</p>
</blockquote>
<p>Sagt wer?<br />
Ist das hier auch well-formed?</p>
<pre><code class="language-cpp">#include &lt;map&gt;
template&lt;template&lt;class,class,class,class&gt; class Foo&gt;
struct blupp {};
int main()
{
  blupp&lt;std::map&gt; x;
}
</code></pre>
</blockquote>
<p>Opops.Mein erstes Statement zu dem Thema war falsch. Natürlich kann man die Geschichte mit der map&lt;X, Y&gt; bzw. map&lt;X, Y, C, A&gt; machen - das ist kein Problem. Anders ists mit dem template template Parameter den du hier gezeigt hast. Ich weiß nicht mehr obs Meyers in einem der Effective C++ Bücher oder Sutter in einem der Exceptional C++ Bücher war - aber genau dieses Beispiel taucht dort auf. Eben weil die Standardcontainer zusätzliche (per default gesetzte) Templateparameter haben <em>dürfen</em> kann es passieren, dass der Compiler std::map nicht mit einem 4-Parameter-Template matchen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742419</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 13 Jul 2009 21:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 21:20:22 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36159">@Sebastian</a> Pizer,<br />
Es gibt nirgendwo eine Garantie, dass <code>std::map</code> genau 4 Templateparameter hat, nur dass man ganz sicher 4 angeben kann. Das ist ein Unterschied. Deshalb ist dein Programm einfach nicht Standardkonform.</p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Wo ziehst Du denn da die Grenze?</p>
</blockquote>
<p>Die Grenze zieht der Standard und zum Teil ist keine vorhanden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>,<br />
Bist du sicher dass es funktioniert? Ich hatte irgendwas im Kopf, dass es unter speziellen Umständen nicht funktionieren kann. Shade Of Mine hat da mal vor langer Zeit etwas präsentiert gehabt. Kann mich nur nicht mehr richtig erinnern und finde es aktuell auch nicht mehr...<br />
Deshalb habe ich, um meine Aussage abzusichern, den Satz noch dazugeschrieben <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742423</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Jul 2009 21:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Mon, 13 Jul 2009 21:44:02 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36159">@Sebastian</a> Pizer,<br />
Es gibt nirgendwo eine Garantie, dass <code>std::map</code> genau 4 Templateparameter hat, nur dass man ganz sicher 4 angeben kann. Das ist ein Unterschied. Deshalb ist dein Programm einfach nicht Standardkonform.</p>
</blockquote>
<p>Wieso ist es das nicht? Woran machst Du das fest? Welcher Satz aus dem Standard lässt Dich das glauben? Du ziehst willkürlich eine Grenze zwischen map&lt;int,int,comp,my_alloc&gt; muss funktionieren aber als std::map muss nicht als template&lt;class,class,class,class&gt;class-Parameter benutzbar sein.</p>
<p>So, wie ich das sehe, beziehen sich die Zitate, die Du gebracht hast, auf Definitionen (Räpresentierung ist implementierungsabhängig), und nicht die Deklarationen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742434</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 21:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Tue, 14 Jul 2009 15:46:44 GMT]]></title><description><![CDATA[<p>Absolute Klasse! Echt.</p>
<p>Am elegantesten finde ich Nexus' zweite Lösung mit den überladenen Ausgabeoperatoren.<br />
Draveres Vorschlag dagegen hat mir in Sachen generischer Programmierung wirklich weitergebracht: Da wurde mir erstmal klar, dass ein</p>
<pre><code class="language-cpp">template&lt;typename K, typename V, typename C, typename A&gt;
struct print_functor&lt;std::map&lt;K, V, C, A&gt; &gt;
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">print_functor&lt;ContainerT&gt; a_print_functor;
</code></pre>
<p>instanziiert werden kann und der Compiler dann die Zeile mit &quot;template&lt;typename... &gt;&quot; ganz automatisch anhand der übergebenen map &quot;ausfüllt&quot;.</p>
<p>Die Diskussion über den Standard war auch ganz informativ.</p>
<p>Danke natürlich auch an alle anderen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742893</guid><dc:creator><![CDATA[moagnus]]></dc:creator><pubDate>Tue, 14 Jul 2009 15:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Tue, 14 Jul 2009 17:50:44 GMT]]></title><description><![CDATA[<p>*gerade noch bemerkt, dass er da noch nicht geantwortet hat*</p>
<p>Da dem moagnus nun geholfen ist, dürfen wir hier auch sicher ohne Gewissensbisse weiterdiskustieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Wieso ist es das nicht? Woran machst Du das fest? Welcher Satz aus dem Standard lässt Dich das glauben?</p>
</blockquote>
<p>Ich wiederhole mich:<br />
Es gibt im ganzen Standard keinen Satz, welcher aussagt, dass <code>std::map</code> genau 4 Templateparemeter haben muss. Es werden 4 präsentiert, aber nirgends gesagt, dass es nicht mehr sein dürfen. Ich kann dir daher keinen Satz zeigen, weil es eben keinen gibt.<br />
Es gibt nur den Code, allerdings ist dieser nicht verbindlich, sondern soll nur zur Verdeutlichung dienen, was wunderbar auch im Standard steht. Im Standard steht aber eben nicht, dass er verbindlich ist.</p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Du ziehst willkürlich eine Grenze zwischen map&lt;int,int,comp,my_alloc&gt; muss funktionieren aber als std::map muss nicht als template&lt;class,class,class,class&gt;class-Parameter benutzbar sein.</p>
</blockquote>
<p>Wenn hier jemand willkürlich ist, dann bist es du, da du einfach willkürlich annimmst, dass der präsentierte Code verbindlich ist.</p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>So, wie ich das sehe, beziehen sich die Zitate, die Du gebracht hast, auf Definitionen (Räpresentierung ist implementierungsabhängig), und nicht die Deklarationen.</p>
</blockquote>
<p>Und das ist dann auch deine willkürliche Interpretation. So steht es nicht im Standard. Du fügst dies einfach dazu, weil es dir logisch erscheint, aber so steht es nicht da. Und entscheidend ist im Standard, was dort steht. Der Standard geht nicht davon aus, dass jemand logische Zusätze reinbaut, so dass es einem besser gefällt. Sonst wäre der Standard ja sinnlos <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>Am einfachsten machen wir es also so, dann bin ich sofort bereit dir zu glauben:<br />
Zeig mir eine Stelle im Standard, wo steht, dass der angegebene Code verbindlich ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742995</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 14 Jul 2009 17:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Partielle Template-Spezialisierung on Tue, 14 Jul 2009 20:55:05 GMT]]></title><description><![CDATA[<p>Dravere, ich verstehe Deine Position, stimme Dir aber nicht zu, weil es für mich einfach nicht nach einer schlüssigen Argumentation aussieht. Du leitest von Kapitel 1.4 irgendwie ab, dass ein Klassentemplate zusätzliche Defaultparameter haben darf weil angeblich nur</p>
<pre><code class="language-cpp">typedef std::map&lt;dings,bums,comp,alloc&gt; t;
</code></pre>
<p>bei entsprechenden Typen dings,bums,comp,alloc funktionieren müsse, nicht aber die Verwendung des Klassentemplates als Template-Parameter des Typs <code>template&lt;class,class,class,class&gt;class</code> . Ich finde das ganz schön weit hergeholt, wenn man sich dazu nochmal Absatz 3 und 8 anguckt:</p>
<blockquote>
<p>3 For classes and class templates, the library clauses specify partial definitions. Private members (clause 11) are not specified, but each implementation shall supply them to complete the definitions according to the description in the library clauses.</p>
<p>8 A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any well-formed program. Implementations are required to diagnose programs that use such extensions that are ill-formed according to this International Standard. Having done so, however, they can compile and execute such programs.</p>
</blockquote>
<p>Absatz 3 --&gt; Der Standard spezifiert partielle Definitionen. Partiell heißt hier, dass es Lücken und Platzhalter gibt, die eine Implementierung sinvoll zu füllen hat um die anderen Spezifikationen zu erfüllen. Hier steht nichts, was einem suggerieren könnte, dass eine konforme Implementierung veränderte Deklaration verwenden kann.</p>
<p>Absatz 8 --&gt; Wenn ich mich richtig erinnere, hast Du diesen Absatz auch zitiert und das Hinzufügen von weiteren Defaultparametern als &quot;Extension&quot; gewertet. Der Standard fordert, dass Erweiterungen nicht das Verhalten von wohlgeformten Programmen ändern dürfen. Ein Programm, welches std::map als template-template-parameter mit 4 eigenen template parametern benutzen will, ist <em>ohne</em> diese Erweiterung wohlgeformt, <em>mit</em> aber leider <em>nicht</em>. Daraus schließe ich, dass eine konforme Implementierung keine zusätzlichen Defaultparameter für Klassentemplates einführen kann.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743089</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 14 Jul 2009 20:55:05 GMT</pubDate></item></channel></rss>