<?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-Spezialisation nur benutzen, falls es sie nicht schon gibt]]></title><description><![CDATA[<p>Ich habe gerade das Problem, dass ich den GCC-spezifischen Typ __int128_t nicht mit generischem Code benutzen kann, weil make_unsigned und dergleichen diesen nicht kennen.</p>
<p>Ich könnte das ja prinzipiell so nachholen:</p>
<pre><code>namespace std {
  template &lt;&gt; struct make_unsigned&lt;__int128_t&gt; {
    typedef __uint128_t type;
  };

  template &lt;&gt; struct make_signed&lt;__uint128_t&gt; {
    typedef __int128_t type;
  };
}
</code></pre>
<p>Kann ich es irgendwie so hinbekommen, dass diese Spezialisationen nur benutzt wird, falls es sie nicht schon gibt (z.B. durch Update der Standardbibliothek) und es den Typ __int128_t auch tatsächlich gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325515/template-spezialisation-nur-benutzen-falls-es-sie-nicht-schon-gibt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 08:19:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325515.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 May 2014 11:24:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Spezialisation nur benutzen, falls es sie nicht schon gibt on Tue, 06 May 2014 11:24:26 GMT]]></title><description><![CDATA[<p>Ich habe gerade das Problem, dass ich den GCC-spezifischen Typ __int128_t nicht mit generischem Code benutzen kann, weil make_unsigned und dergleichen diesen nicht kennen.</p>
<p>Ich könnte das ja prinzipiell so nachholen:</p>
<pre><code>namespace std {
  template &lt;&gt; struct make_unsigned&lt;__int128_t&gt; {
    typedef __uint128_t type;
  };

  template &lt;&gt; struct make_signed&lt;__uint128_t&gt; {
    typedef __int128_t type;
  };
}
</code></pre>
<p>Kann ich es irgendwie so hinbekommen, dass diese Spezialisationen nur benutzt wird, falls es sie nicht schon gibt (z.B. durch Update der Standardbibliothek) und es den Typ __int128_t auch tatsächlich gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397634</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 11:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisation nur benutzen, falls es sie nicht schon gibt on Tue, 06 May 2014 13:00:53 GMT]]></title><description><![CDATA[<p>Es ist wohl nicht möglich zu prüfen <a href="http://stackoverflow.com/questions/20593771/detect-if-a-type-exists-in-c" rel="nofollow">ob es einen Typ gibt</a>.</p>
<p>Ich würde den Kram in einen eigenen Namespace tun und den benutzen:</p>
<pre><code>namespace stdaddon{ //geht nicht mit std
	template&lt;class T&gt;
	struct make_unsigned{
		using type = typename std::make_unsigned&lt;T&gt;::type;
	};
	template&lt;&gt;
	struct make_unsigned&lt;__int128_t&gt;{
		using type = __uint128_t;
	};
}

int main(){
	stdaddon::make_unsigned&lt;__int128_t&gt;::type i;
	std::cout &lt;&lt; typeid(i).name();
}
</code></pre>
<p>Sollte es tatsächlich ein Update geben kannst du mit wenig Aufwand direkt die Standardbibliothek benutzen:</p>
<pre><code>namespace stdaddon{
	using namespace std; //einfache globale Änderung
}

int main(){ //clientcode gleich
	stdaddon::make_unsigned&lt;__int128_t&gt;::type i;
	std::cout &lt;&lt; typeid(i).name();
}
</code></pre>
<p>Es ist wohl über Bande möglich zu testen, <a href="http://stackoverflow.com/questions/10711952/how-to-detect-existence-of-a-class-using-sfinae" rel="nofollow">ob es eine Klasse gibt</a>. Damit kannst du bestimmt testen, ob es std::make_unsigned&lt;__int128_t&gt; gibt und andernfallst definieren, vorausgesetzt es gibt __int128_t.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397662</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 06 May 2014 13:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisation nur benutzen, falls es sie nicht schon gibt on Tue, 06 May 2014 14:34:13 GMT]]></title><description><![CDATA[<p>Stimmt, wenn ich eine eigene Variante dieser Templates einführe, funktioniert immerhin schon mal mein eigener Code. Ich dachte, es wäre schon, wenn ich damit auch fremden Code sozusagen 128 bit-fähig machen könnte. Aber wenn ich mir es recht überlege, dann ist es nicht meine Angelegenheit, mich um die Funktionalität von fremden Code zu kümmern, sondern die des Nutzers.</p>
<p>Dass man zumindest die Existenz von Klassen überprüfen kann, ist schon mal sehr nützlich, da sowieso fast alles eine Klasse ist (und offenbar ist das Makro __SIZEOF_INT128__ definiert, wenn __int128_t verfügbar ist).</p>
<p>Danke, ist damit gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397691</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 14:34:13 GMT</pubDate></item></channel></rss>