<?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[Erlaubte Template-Argumente prüfen sinnvoll?]]></title><description><![CDATA[<p>Momentan habe ich in einer Klasse eine Template-Methode. Als Templateargumente sind alle Klassen welche von einer bestimmten Klasse geerbt haben, sowie void, erlaubt.</p>
<p>Jetzt könnte ich ja mit Hilfe von std::is_base_of usw. überprüfen, ob im Code korrekte Datentypen verwendet wurden. Ist es sinnvoll das zu tun? Oder kann man sich das sparen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332219/erlaubte-template-argumente-prüfen-sinnvoll</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 10:57:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332219.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Apr 2015 07:50:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 07:50:08 GMT]]></title><description><![CDATA[<p>Momentan habe ich in einer Klasse eine Template-Methode. Als Templateargumente sind alle Klassen welche von einer bestimmten Klasse geerbt haben, sowie void, erlaubt.</p>
<p>Jetzt könnte ich ja mit Hilfe von std::is_base_of usw. überprüfen, ob im Code korrekte Datentypen verwendet wurden. Ist es sinnvoll das zu tun? Oder kann man sich das sparen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450449</guid><dc:creator><![CDATA[kkkl]]></dc:creator><pubDate>Thu, 16 Apr 2015 07:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 08:16:32 GMT]]></title><description><![CDATA[<p>Wäre es nicht sinnvoller das über Polymorphie zu machen und eine Überladung für void anzubieten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450452</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Thu, 16 Apr 2015 08:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 09:19:27 GMT]]></title><description><![CDATA[<pre><code>#include &lt;type_traits&gt;

class Base
{};

class Derive1 : public Base
{};

class Derive2 : public Base
{};

struct Foo
{
	template&lt;class T&gt;
	void foo()
	{
		static_assert(std::is_base_of&lt;Base, T&gt;::value || std::is_same&lt;T, void&gt;::value, &quot;Must be Base of Base or void&quot;);
	}
};

int main()
{
	Foo f;
	f.foo&lt;void&gt;();
	f.foo&lt;Derive1&gt;();
	f.foo&lt;Derive2&gt;();

	//f.foo&lt;int&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2450463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450463</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 16 Apr 2015 09:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 11:09:41 GMT]]></title><description><![CDATA[<p><code>is_base_of</code> berücksichtigt auch private oder ambige Basisklassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450475</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 16 Apr 2015 11:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 12:40:35 GMT]]></title><description><![CDATA[<p>Ich würde vermutlich einfach ne implizite Konvertierung reinschreiben, da meckert der Compiler dann von selbst wenn es nicht funktioniert.<br />
(Für <code>void</code> wird es ja vermutlich eine eigene Spezialisierung geben...?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450484</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 16 Apr 2015 12:40:35 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 13:32:39 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich würde vermutlich einfach ne implizite Konvertierung reinschreiben, da meckert der Compiler dann von selbst wenn es nicht funktioniert.</p>
</blockquote>
<p>Wobei die Fehlermeldung dann vermutlich weit weniger aussagekräftig ist als die Lösung mit dem static_assert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450500</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Thu, 16 Apr 2015 13:32:39 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 17:33:44 GMT]]></title><description><![CDATA[<p>kkkl schrieb:</p>
<blockquote>
<p>Momentan habe ich in einer Klasse eine Template-Methode. Als Templateargumente sind alle Klassen welche von einer bestimmten Klasse geerbt haben, sowie void, erlaubt.</p>
</blockquote>
<p>Sicher?</p>
<p>kkkl schrieb:</p>
<blockquote>
<p>Jetzt könnte ich ja mit Hilfe von std::is_base_of usw. überprüfen, ob im Code korrekte Datentypen verwendet wurden. Ist es sinnvoll das zu tun? Oder kann man sich das sparen?</p>
</blockquote>
<p>Meistens kann man sich es sparen. Der Verwender hat schon ein gar mulmiges Gefühl, wenn er entgegen Deiner Doku irgendwas anderes reinsteckt. Wenns dann zum Fehler kommt, muss er nicht lange nachdenken oder suchen.</p>
<p>Meinstens2 ist der Wunsch nach Verebungseinschränkung einer javaesken Denke geschuldet und gar nicht sinnig: Wenns mit ner anderen Klasse auch duchcompiliert, darf sie bitte auch mitspielen. Dabei denke ich an STL-Algos und so nen Schmonz, die klappen wunderbar.</p>
<p>Was ist das für ein Code, der mit falschen Klassen duchcompiliert, und dann auch noch was falsches macht?</p>
<pre><code>class Bee{
   int sum(){
      string myMelody=getFromDatabase...
      if(myMelody)
         return -1;//thinking in C
      clog&lt;&lt;myMelody;
      return 0;
   }
</code></pre>
<pre><code>class Histogram{
   int sum(){
      for(...
         s+=*i;
      return s;//wellbrained
</code></pre>
<p>Denke nicht, daß es der Mühe wert ist, den Benutzer dagegen zu schützen. Zumal es Leute wie mich gibt, die lieber mal in den Quellcode schauen als in die Doku und dort dann von Template-Metaprogrammierung regelmäßig im Lesefluss gebremst werden.</p>
<p>Ich warte mal auf die concepts oder wie es im nächsten/übernächsten C++-Standard perfekt gelöst wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450528</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 16 Apr 2015 17:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to Erlaubte Template-Argumente prüfen sinnvoll? on Thu, 16 Apr 2015 18:18:46 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich würde vermutlich einfach ne implizite Konvertierung reinschreiben, da meckert der Compiler dann von selbst wenn es nicht funktioniert.</p>
</blockquote>
<p>Wobei die Fehlermeldung dann vermutlich weit weniger aussagekräftig ist als die Lösung mit dem static_assert</p>
</blockquote>
<p>Ja, möglich.<br />
Wobei für mich viel wichtiger ist dass es verständlich ist, wenn man zu der Zeile springt die in der Fehlermeldung erwähnt wird. (Also dass die Meldung selbst kryptisch finde ich nicht so schlimm, wenn ich dann im Code sofort sehe was das Problem ist.)<br />
Sowas wie</p>
<pre><code class="language-cpp">...
   Foo* foo = &amp;bar; // bar must be derived from Foo
   foo-&gt;DoFooStuff();
   ...
</code></pre>
<p>sollte IMO reichen.</p>
<p>BTW: Gibt's nen &quot;is assignable from&quot; oder &quot;is implicitly convertible to&quot; trait?<br />
Dann könnte man das selbe auch als <code>static_assert</code> schreiben.<br />
Ich fände das nämlich sogar besser mit <code>static_assert</code> . Nur würde ich mir keinen Aufwand dafür antun nur um es mit <code>static_assert</code> schreiben zu können, wenn es eine sehr einfache und vor allem garantiert &quot;richtige&quot; Version ohne <code>static_assert</code> gibt, die auch zumindest brauchbare compile-time Fehlermeldungen erzeugt.</p>
<p>BTW2: Ich hatte selbst schon öfter den Fall dass ich &quot;explizit implizit&quot; konvertieren wollte. Also genau das was <code>U u = t;</code> macht. Also explizit hinschreiben dass ich nen U brauche, dabei aber eben nur implizite Konvertierungen erlauben. Gibt's da ne verständliche &quot;inline&quot; Schreibweise? Also eine die ohne zusätzliche Variable auskommt? Vielleicht eine Hilfsfunktion in der Boost oder sowas? Wäre ja relativ einfach...</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
T implicit_cast(U&amp;&amp; u)
{
    return u;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2450531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450531</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:18:46 GMT</pubDate></item></channel></rss>