<?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[Kann man bei einem template die Typen einschränken?]]></title><description><![CDATA[<p>Huhu</p>
<p>Ich habe mich früher schon einmal gefragt, ob man bei einem template die möglichen Typen einschränken kann. Wenn ich z.B. in einer Templateklasse dem Nutzer nur die Möglichkeiten int, double und long zur Verfügung stellen möchte.</p>
<p>Ist das möglich?</p>
<p>PS:<br />
Habe bei google unter dem Suchbegriff &quot;C++ templates type restrictions&quot; nichts dergleichen gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260952/kann-man-bei-einem-template-die-typen-einschränken</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 20:24:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260952.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Feb 2010 10:59:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 10:59:21 GMT]]></title><description><![CDATA[<p>Huhu</p>
<p>Ich habe mich früher schon einmal gefragt, ob man bei einem template die möglichen Typen einschränken kann. Wenn ich z.B. in einer Templateklasse dem Nutzer nur die Möglichkeiten int, double und long zur Verfügung stellen möchte.</p>
<p>Ist das möglich?</p>
<p>PS:<br />
Habe bei google unter dem Suchbegriff &quot;C++ templates type restrictions&quot; nichts dergleichen gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854098</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 11 Feb 2010 10:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 11:11:47 GMT]]></title><description><![CDATA[<p>Du kannst dir sowas mit BOOST_STATIC_ASSERT und boost::is_same was basteln, und wenn du verrückt bist, kannst du die erlaubten Typen vielleicht sogar in ne Typelist packen und musst nicht alle erlaubten Typen ORn.<br />
Ohne Typelist gehts in etwa so:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void restricted(const T&amp; t)
{
  BOOST_STATIC_ASSERt(boost::is_same&lt;T, double&gt;::value || boost::is_same&lt;T, int&gt;::value);
}
</code></pre>
<p>Um mehrere Typen zu überprüfen bieten sich die Type-Traits von boost auch an, wie zb boost::is_integral oder boost::is_pointer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854106</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 11 Feb 2010 11:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 11:15:30 GMT]]></title><description><![CDATA[<p>Keine Ahnung ob man das einschränken kann, ich würde es einfach mit der <em>typeinfo</em> machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo.h&gt;

template &lt;typename T&gt;
void func(T &amp;t)
{
	std::cout&lt;&lt; typeid(T).name() &lt;&lt;std::endl;
	std::cout&lt;&lt; typeid(t).name() &lt;&lt;std::endl;
}

int main()
{
	int a = 10;

	func&lt;int&gt;(a);
}
</code></pre>
<p>Ich glaube da gibt es auch was in Boost.</p>
<p>EDIT:<br />
Ja, siehe Post über mir <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1854108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854108</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Thu, 11 Feb 2010 11:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 11:14:34 GMT]]></title><description><![CDATA[<p>Nicht direkt. Aber über <a href="http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error" rel="nofollow">SFINAE</a> (siehe zB Boost Enable If) oder über static_assert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854109</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 11 Feb 2010 11:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 11:16:35 GMT]]></title><description><![CDATA[<p>Kurze Gegenfrage: Wozu soll das gut sein? Templates sind ja gerade dazu da, damit man sich nicht einschränken muss. Wenn man was beschränktes will, kann man ja auch Überladung verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854111</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 11 Feb 2010 11:16:35 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 11:27:39 GMT]]></title><description><![CDATA[<p>@ Rüdiger<br />
Thx für den Link.</p>
<p>@ SeppJ<br />
Für gewisse Klassen macht es keinen Sinn gewissen Typen zu verwenden. Den Nutzer der Klasse also einschränken, so dass dieser weniger Fehler machen kann (habe nur im Effective C++ gelesen, dass man Fehler auf Seite des Clients möglichst vermeiden sollte).</p>
<p>Durch Overloading kann es halt vorkommen, dass anschliessend einiges an Code doppelt vorkommt. Von daher hätte ich es schön gefunden, wenn man templates auf einige Typen beschränken kann.<br />
Kann aber gut sein, dass das nicht wirklich viel Sinn ergibt.</p>
<p>@ Kóyaánasqatsi<br />
Bin jetzt nicht ganz sicher ob es das ist, was ich wirklich möchte. Ich teste es dann mal kurz.</p>
<p>Thx für eure Antworten</p>
<p>*Edit<br />
@ Maxi<br />
Hatte zuerst deinen Post übersehen ^^<br />
Ich glaube das ist es, wonach ich gesucht habe. Kenne mich mit Boost leider (noch) nicht aus.</p>
<p>Thx <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/1854114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854114</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 11 Feb 2010 11:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 12:51:24 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kurze Gegenfrage: Wozu soll das gut sein?</p>
</blockquote>
<p>Schonmal was von <a href="http://www.generic-programming.org/about/glossary.php" rel="nofollow">Concepts</a> gehört? <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>Ich kann das <a href="http://video.google.com/videoplay?docid=-1790714981047186825" rel="nofollow">Video</a> zum Vortrag von Doug Gregor empfehlen -- obwohl es schon 3 Jahre alt ist und nicht mehr 100%ig dem aktuellsten Entwurf enspricht. Leider hat das Standardisierungskomitee es nicht geschafft, concepts für die nächste Version von C++ zu standardisieren. -- Vielleicht klappt's beim nächsten Mal.</p>
<p>C++0x bietet allerdings Möglichkeiten, zumindest teilweise Concepts zu <a href="http://pizer.wordpress.com/2009/08/16/c0x-no-concepts-no-fun/" rel="nofollow">emulieren</a>.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Templates sind ja gerade dazu da, damit man sich nicht einschränken muss.</p>
</blockquote>
<p>Würde ich so nicht sagen. Du kannst in einem std::vector auch nur Objekte ablegen, die sich kopieren lassen. Und Concepts wäre eine Möglichkeit gewesen, diese Bedingung -- welche bisher nur in Form von Dokumentation vorhanden ist -- auf der Ebenbe der Programmiersprache zu formalisieren. Das dürfte dem Compiler auch kürzere und leichter verständlichere Fehlermeldungen entlocken.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854162</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 11 Feb 2010 12:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 14:05:15 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Klar kenne ich concepts, aber: Es ist ja auch schon heute nicht möglich, einen vector mit nicht kopierbaren Objekten zu verwenden. Ok, die Fehlermeldung die man dann bekommt ist total kryptisch, da könnten concepts helfen. Außerdem sähe man bei Concepts sofort die Mindestanforderungen ohne eine Doku zu benötigen. Aber extra irgendwas zu basteln, so dass ich den vector nur mit der Art von Objekt verwenden kann, die <strong>ich jetzt</strong> für sinnvoll erachte, schränkt doch <strong>alle anderen später</strong> unnötig ein. Wenn die Templateparameter nicht den Anforderungen entsprechen gibt es auch heute schon eine Fehlermeldung und wenn die Templateparameter den Anforderungen genügen und der Programmierer sie benutzen will, dann wird das schon irgendwie Sinn machen sie zu verwenden. Wer bin ich, dass ich diese Entscheidung treffe?</p>
<p>Gerade hier ist das doch ein gutes Beispiel: Der Threadersteller will sein Template auf int, double und long beschränken. Warum er char, short und float ausklammern will, wird seine Gründe haben, ich spekulier mal sie sind ihm zu ungenau. Aber was, wenn ich mit einer eigenen Klasse für extra große Zahlen komme? Oder mit einer C++ Erweiterung die long long kennt? Alles was int, double und long können, können solche Klassen/Typen sinnvollerweise auch. Warum sollte ich sie nicht verwenden dürfen?<br />
Eine sinnvollere Beschränkung in diesem Fall wäre es, die Genauigkeit zu prüfen. Da kann man beispielsweise verlangen, dass der Templateparameter einen Eintrag in numeric_limits hat, der irgendwelche Mindestvoraussetzungen erfüllt. Erfüllen sie es nicht, kann man ja zumindest versuchen, dass mit einem static_assert die resultierende Fehlermeldung nicht ganz so kryptisch ist, wie sonst üblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854200</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 11 Feb 2010 14:05:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man bei einem template die Typen einschränken? on Thu, 11 Feb 2010 14:34:41 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wer bin ich, dass ich diese Entscheidung treffe?</p>
</blockquote>
<p>conecepts sind keine einschränkung, concepts erlauben nur gute Fehlermeldungen.<br />
das ist alles.</p>
<p>Und das wirklich tolle an concepts sind concept maps <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>PS:<br />
und natürlich spezialisierungen auf bestimmte concepts. das ist auch was tolles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1854221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1854221</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 11 Feb 2010 14:34:41 GMT</pubDate></item></channel></rss>