<?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 spezialisierung und integrale typen]]></title><description><![CDATA[<p>hallo,<br />
ich möchte für eine template-member funktion eine spezialisierung für integrale typen schreiben. das problem ist, dass diese vom compiler nur genutzt wird, wenn wirklich exakt der angegebene typ genutzt wurde, für impliziet konvertierbare typen wird die allgemeine template-funktion genutzt.<br />
das mag zwar noch nachvollziehbar sein, mich verwundert allerdings, wie das in der implementation von list.insert vom gcc gezaubert wurde, dort steht nämlich:</p>
<pre><code>void insert(iterator __position, size_type __n, const value_type&amp; __x)
{  
  list __tmp(__n, __x, _M_get_Node_allocator());
  splice(__position, __tmp);
}

template&lt;typename _InputIterator&gt;
void insert(iterator __position, _InputIterator __first,
	       _InputIterator __last)
{
  list __tmp(__first, __last, _M_get_Node_allocator());
  splice(__position, __tmp);
}
</code></pre>
<p>und der compiler ist durchaus schlau genug die erste variante aufzurufen, auch wenn value_type = int ist und __x von einem anderen integralen typ konvertiert wird sowie __n nicht explizit nach size_type gecastet wurde.</p>
<p>hier mein beispiel:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;list&gt;

using namespace std;

struct S{
  int x;
};

template &lt;typename T&gt;
class C{
  public:
    template &lt;typename T2&gt;
    void foo(T2 i){
      i.x = 0;
    }

    void foo(size_t i){
    }

};

int main(){
  for(int i = 0, j = 0; true; ++i, ++j);

  C&lt;int&gt; c;
  c.foo((size_t)0); //funktioniert
  c.foo(0); //funktioniert nicht, versucht template-fkt. zu verwenden

  list&lt;int&gt; l;
  l.insert(l.end(), 5, 5); //funktioniert
  l.insert(l.end(), (int)5, (size_t)5); //funktioniert
  l.insert(l.end(), (long long)5, (long long)5); //funktioniert
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/224458/template-spezialisierung-und-integrale-typen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 14:17:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224458.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Oct 2008 17:32:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Thu, 09 Oct 2008 17:32:31 GMT]]></title><description><![CDATA[<p>hallo,<br />
ich möchte für eine template-member funktion eine spezialisierung für integrale typen schreiben. das problem ist, dass diese vom compiler nur genutzt wird, wenn wirklich exakt der angegebene typ genutzt wurde, für impliziet konvertierbare typen wird die allgemeine template-funktion genutzt.<br />
das mag zwar noch nachvollziehbar sein, mich verwundert allerdings, wie das in der implementation von list.insert vom gcc gezaubert wurde, dort steht nämlich:</p>
<pre><code>void insert(iterator __position, size_type __n, const value_type&amp; __x)
{  
  list __tmp(__n, __x, _M_get_Node_allocator());
  splice(__position, __tmp);
}

template&lt;typename _InputIterator&gt;
void insert(iterator __position, _InputIterator __first,
	       _InputIterator __last)
{
  list __tmp(__first, __last, _M_get_Node_allocator());
  splice(__position, __tmp);
}
</code></pre>
<p>und der compiler ist durchaus schlau genug die erste variante aufzurufen, auch wenn value_type = int ist und __x von einem anderen integralen typ konvertiert wird sowie __n nicht explizit nach size_type gecastet wurde.</p>
<p>hier mein beispiel:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;list&gt;

using namespace std;

struct S{
  int x;
};

template &lt;typename T&gt;
class C{
  public:
    template &lt;typename T2&gt;
    void foo(T2 i){
      i.x = 0;
    }

    void foo(size_t i){
    }

};

int main(){
  for(int i = 0, j = 0; true; ++i, ++j);

  C&lt;int&gt; c;
  c.foo((size_t)0); //funktioniert
  c.foo(0); //funktioniert nicht, versucht template-fkt. zu verwenden

  list&lt;int&gt; l;
  l.insert(l.end(), 5, 5); //funktioniert
  l.insert(l.end(), (int)5, (size_t)5); //funktioniert
  l.insert(l.end(), (long long)5, (long long)5); //funktioniert
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1596493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1596493</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 09 Oct 2008 17:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 16:57:02 GMT]]></title><description><![CDATA[<p>hmm, zu unverständlich formuliert? <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>edit: problem gelöst. tiefer im code der STL sind überladungen für alle 13 integer typen versteckt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597089</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 10 Oct 2008 16:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:11:47 GMT]]></title><description><![CDATA[<p>13? Also mit allen <code>typedef</code> s, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597112</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:16:26 GMT]]></title><description><![CDATA[<p>also das sieht dann so aus:</p>
<pre><code class="language-cpp">template&lt;typename _Tp&gt;
struct __is_integer
{
  enum { __value = 0 };
  typedef __false_type __type;
};

// Thirteen specializations (yes there are eleven standard integer
// types; 'long long' and 'unsigned long long' are supported as
// extensions)
template&lt;&gt;
struct __is_integer&lt;bool&gt;
{
  enum { __value = 1 };
  typedef __true_type __type;
};
// usw...
</code></pre>
<p>und den __type nutzt man dann als übergabe-parameter um die passende überladung der funktion aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597115</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:29:53 GMT]]></title><description><![CDATA[<p>Interessiert mich gerade, wie man auf dreizehn kommt... <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>So?</p>
<pre><code class="language-cpp">bool
unsigned char
signed char
unsigned wchar_t
signed wchar_t
unsigned short
signed short
unsigned int
signed int
unsigned long
signed long
unsigned long long
signed long long
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1597122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597122</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:35:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// Thirteen specializations (yes there are eleven standard integer
// types; 'long long' and 'unsigned long long' are supported as
// extensions)
</code></pre>
<p>guckst du INCLUDEDIR/bits/cpp_type_traits.h falls du einen GCC zur hand hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597127</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:35:31 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:44:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Interessiert mich gerade, wie man auf dreizehn kommt... <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>So?</p>
<pre><code class="language-cpp">bool
unsigned char
signed char
unsigned wchar_t
signed wchar_t
unsigned short
signed short
unsigned int
signed int
unsigned long
signed long
unsigned long long
signed long long
</code></pre>
</blockquote>
<p>fast. wchar_t kennt keine signed/unsigned-Zusätze (welche Variante zutrifft, hängt vom Compiler ab). Aber du hast auch char als eigenständigen Typ vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597132</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:44:29 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 17:50:31 GMT]]></title><description><![CDATA[<p>hmm, und wchar_t ist wohl nicht auf jedem compiler verfügbar, es ist zum heulen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597133</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 10 Oct 2008 17:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Fri, 10 Oct 2008 18:55:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Aber du hast auch char als eigenständigen Typ vergessen.</p>
</blockquote>
<p>Danke für die Erklärung; ich wusste nicht, dass <code>char</code> in drei Variationen vorkommt. Ich dachte einfach, es sei systemabhängig, ob er in seiner Standardform <code>signed</code> oder <code>unsigned</code> ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597166</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 10 Oct 2008 18:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to template spezialisierung und integrale typen on Sat, 11 Oct 2008 09:56:11 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Aber du hast auch char als eigenständigen Typ vergessen.</p>
</blockquote>
<p>Danke für die Erklärung; ich wusste nicht, dass <code>char</code> in drei Variationen vorkommt. Ich dachte einfach, es sei systemabhängig, ob er in seiner Standardform <code>signed</code> oder <code>unsigned</code> ist.</p>
</blockquote>
<p>Es ist system- und compilerabhängig, ob char vorzeichenbehaftet ist oder nicht, das ist richtig. Trotzdem sind char und der entsprechend qualifizierte un/signed char zwei verschiedene Typen. In der Hinsicht unterscheidet sich un/signed char von den anderen Typen, wo die signed-qualifikation weggelassen werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597276</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 11 Oct 2008 09:56:11 GMT</pubDate></item></channel></rss>