<?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[Frage bzgl. Kindklasse die von Template-Klasse erbt]]></title><description><![CDATA[<p>Ahoi,</p>
<p>Hoffe habt eine Idee zu folgendem Problem:</p>
<p>Ich habe folgende Klasse Counter</p>
<pre><code>template &lt;class V&gt;
class Counter
{
   public:
    Counter(){}
    virtual void Counter(){}

    virtual void Print()
    {
      // hier stream operationen, die nur fuer bestimmte V zulaessig sind
    }
};
</code></pre>
<p>Ich wuerde nun gerne obige Print Methode nur fuer bestimmte (!) Auspraegungen von Counter erlauben, z.B. nur fuer</p>
<pre><code>Counter&lt;int&gt; 
// oder 
Counter&lt;float&gt;
</code></pre>
<p>wie sieht nun solch eine kindklasse aus ? weiss nicht wie das syntax-maessig aussehen muesste ..</p>
<p>danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326857/frage-bzgl-kindklasse-die-von-template-klasse-erbt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 11:05:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326857.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jul 2014 11:20:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 11:20:41 GMT]]></title><description><![CDATA[<p>Ahoi,</p>
<p>Hoffe habt eine Idee zu folgendem Problem:</p>
<p>Ich habe folgende Klasse Counter</p>
<pre><code>template &lt;class V&gt;
class Counter
{
   public:
    Counter(){}
    virtual void Counter(){}

    virtual void Print()
    {
      // hier stream operationen, die nur fuer bestimmte V zulaessig sind
    }
};
</code></pre>
<p>Ich wuerde nun gerne obige Print Methode nur fuer bestimmte (!) Auspraegungen von Counter erlauben, z.B. nur fuer</p>
<pre><code>Counter&lt;int&gt; 
// oder 
Counter&lt;float&gt;
</code></pre>
<p>wie sieht nun solch eine kindklasse aus ? weiss nicht wie das syntax-maessig aussehen muesste ..</p>
<p>danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407965</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 11:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 11:32:44 GMT]]></title><description><![CDATA[<p>sorry, beim destruktor der obigen klasse fehlt eine tilde (~).</p>
<p>mein problem laesst sich vielleichth aus so formulieren:</p>
<p>ich moechte nur bestimmte Typen fuer V bei der instanzierung erlauben,<br />
z.B. alle standard-zahlen-datentypen</p>
<p>Counter&lt;int&gt;<br />
Counter&lt;float&gt;<br />
Counter&lt;short&gt;<br />
..<br />
usw.</p>
<p>aber nichts(!) anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407966</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 11:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 11:51:13 GMT]]></title><description><![CDATA[<p>Naja du fragst hier schon nach zwei ziemlich unterschiedliche Sachen. Wenn du nur fundamentale Typen zulassen willst, kannst du das machen:</p>
<pre><code>template &lt;typename T, typename std::enable_if&lt;std::is_fundamental&lt;T&gt;::value&gt;::type* = nullptr&gt;
class A { };
</code></pre>
<p>Alternativ, wenn du schöne Compiler-Fehlermeldungen willst, lässt du das enable_if weg und fügst dafür in jeden Konstruktor von A das ein:</p>
<pre><code class="language-cpp">static_assert(std::is_fundamental&lt;T&gt;::value, &quot;Not allowed&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407969</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 10 Jul 2014 11:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 11:52:19 GMT]]></title><description><![CDATA[<pre><code>template &lt;class V, bool = std::is_arithmetic&lt;V&gt;::value&gt; 
class Counter;
template&lt;class V&gt;
class Counter&lt;V, true&gt;
{
    // ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2407971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407971</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 10 Jul 2014 11:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:19:52 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Naja du fragst hier schon nach zwei ziemlich unterschiedliche Sachen. Wenn du nur fundamentale Typen zulassen willst, kannst du das machen:</p>
<pre><code>template &lt;typename T, typename std::enable_if&lt;std::is_fundamental&lt;T&gt;::value&gt;::type* = nullptr&gt;
class A { };
</code></pre>
<p>Alternativ, wenn du schöne Compiler-Fehlermeldungen willst, lässt du das enable_if weg und fügst dafür in jeden Konstruktor von A das ein:</p>
<pre><code class="language-cpp">static_assert(std::is_fundamental&lt;T&gt;::value, &quot;Not allowed&quot;);
</code></pre>
</blockquote>
<p>ok, vielen dank. allerdings gibt es vielleicht noch eine einschraenkung:<br />
es muss auf linux (gcc/g++) compilierbar sein.</p>
<p>fuer std::is_arithmetic oder std::is_fundamental etc.<br />
muss man &lt;type_traits&gt; includieren.</p>
<p>mein compiler g++(2.4.1) auf FreeBSD kennt diesen header nicht !?</p>
<p>laesst sich obiges vielleich mit partial template specialization machen (beispiel-code) !?</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407977</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:23:16 GMT]]></title><description><![CDATA[<p>Du kannst es so probieren wie afdslol. Aber ehrlich gesagt solltest du stattdessen lieber deinen GCC aktualisieren und C++11 programmieren.</p>
<p>Edit: <a href="http://www.gnu.org/software/gcc/releases.html" rel="nofollow">http://www.gnu.org/software/gcc/releases.html</a> GCC 2.4.1 ist aus dem Jahre 1993. Dein Ernst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407979</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:26:26 GMT]]></title><description><![CDATA[<p>..<br />
zusaetzlich faellt mir auf, dass obiges erst zur laufzeit gecheckt wird (!?) .. schoener waers schon zur compilierzeit (wenn ich mich nicht irre).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407980</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:28:15 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Du kannst es so probieren wie afdslol. Aber ehrlich gesagt solltest du stattdessen lieber deinen GCC aktualisieren und C++11 programmieren.</p>
<p>Edit: <a href="http://www.gnu.org/software/gcc/releases.html" rel="nofollow">http://www.gnu.org/software/gcc/releases.html</a> GCC 2.4.1 ist aus dem Jahre 1993. Dein Ernst?</p>
</blockquote>
<p>ich programmiere das leider nicht fuer private zwecke sondern fuer eine firma. die entwicklungsumgebungsgegebenheiten lassen sich leider nicht so einfach upgraden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407981</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:28:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:33:00 GMT]]></title><description><![CDATA[<p><code>std::is_arithmetic</code> etc. lässt sich auch ganz einfach mit einer älteren C++-Standardisierung implementieren:</p>
<pre><code>template&lt;typename T&gt;
struct IsArithmetic
{
	static const bool Value = false;
};
template&lt;&gt;
struct IsArithmetic&lt;bool&gt;
{
	static const bool Value = true;
};
template&lt;&gt;
struct IsArithmetic&lt;char&gt;
{
	static const bool Value = true;
};
template&lt;&gt;
struct IsArithmetic&lt;unsigned char&gt;
{
	static const bool Value = true;
};
template&lt;&gt;
struct IsArithmetic&lt;signed char&gt;
{
	static const bool Value = true;
};
// ...
</code></pre>
<p>pepe75 schrieb:</p>
<blockquote>
<p>..<br />
zusaetzlich faellt mir auf, dass obiges erst zur laufzeit gecheckt wird (!?)</p>
</blockquote>
<p>Falsch.</p>
<p>pepe75 schrieb:</p>
<blockquote>
<p>ich programmiere das leider nicht fuer private zwecke sondern fuer eine firma. die entwicklungsumgebungsgegebenheiten lassen sich leider nicht so einfach upgraden.</p>
</blockquote>
<p>Dazu fällt mir nun wirklich gar nichts ein...</p>
<p>Edit:</p>
<p>pepe75 schrieb:</p>
<blockquote>
<p>laesst sich obiges vielleich mit partial template specialization machen (beispiel-code) !?</p>
</blockquote>
<p>Hast du meinen Beitrag also ignoriert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407982</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 12:36:26 GMT]]></title><description><![CDATA[<p>asdflol schrieb:</p>
<blockquote>
<p>std::is_arithmetic etc. lässt sich auch ganz einfach mit einer älteren C++-Standardisierung implementieren:</p>
</blockquote>
<p>Wenn es denn 1993 schon standardisiert gewesen wäre...</p>
<p>Das entschuldigt meiner Ansicht nach nicht, einen 21 Jahre alten Compiler zu benutzen (ist das BSD genauso alt?), aber sei's drum.<br />
Zur Laufzeit wird hier garnichts geprüft. Das ist alles Compile-Time. C++ wurde zum ersten mal 1998 standardisiert, keine Ahnung also, was 5 Jahre davor schon im GCC implementiert war (insbesondere Template-Spezialisierung). Probiere es doch einfach aus, wie asdflol gesagt hat! Und denke mal scharf nach, ob ein Update nach 21 Jahren die Arbeit nicht wert sein könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407984</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Thu, 10 Jul 2014 12:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 13:00:24 GMT]]></title><description><![CDATA[<p>danke asdflol .. funktioniert so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407986</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 10 Jul 2014 13:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 14:01:38 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>mein compiler g++(2.4.1)</p>
</blockquote>
<p>glaube ich nicht.<br />
Was gibt gcc --version aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408004</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2014 14:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Thu, 10 Jul 2014 17:16:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: Tuts</p>
<pre><code>template &lt;typename T&gt; struct is_arithmetic
{
    static bool const value = std::numeric_limits&lt;T&gt;::is_specialized;
};
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408063</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 10 Jul 2014 17:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Fri, 11 Jul 2014 05:09:45 GMT]]></title><description><![CDATA[<p>Ich antworte mal auf die ursprüngliche Frage:</p>
<p>pepe75 schrieb:</p>
<blockquote>
<p>Ich wuerde nun gerne obige Print Methode nur fuer bestimmte (!) Auspraegungen von Counter erlauben, z.B. nur fuer ...</p>
</blockquote>
<pre><code class="language-cpp">template &lt;class V&gt;
struct CounterPrinter;

template &lt;class V&gt;
struct CounterPrinterImpl
{
    static void Print(std::ostream&amp; os, V const&amp; v)
    {
        os &lt;&lt; v;
    }
}

template &lt;&gt; struct CounterPrinter&lt;char&gt; : CounterPrinterImpl&lt;char&gt;;
template &lt;&gt; struct CounterPrinter&lt;short&gt; : CounterPrinterImpl&lt;short&gt;;
template &lt;&gt; struct CounterPrinter&lt;int&gt; : CounterPrinterImpl&lt;int&gt;;
// ...

template &lt;class V&gt;
class Counter
{
public:
    Counter(){}
    virtual ~Counter(){}

    virtual void Print() // virtual?
    {
        CounterPrinter&lt;V&gt;::Print(std::cout, m_v);
    }

private:
    V m_v;
};
</code></pre>
<p><code>Counter</code> lässt sich jetzt mit allen Typen verwenden, aber nur mit den Typen <code>char, short</code> und <code>int</code> hat <code>Counter</code> eine <code>Print()</code> Funktion.</p>
<p>Die Funktionsdefinition existiert zwar uneingeschränkt im <code>Counter</code> Template, aber das ist erlaubt. Fehler gibt's erst wenn die Funktion irgendwo referenziert wird, weil das Funktionstemplate eben für z.B. <code>Counter&lt;std::string&gt;</code> nicht instanzierbar ist.<br />
<code>enable_if</code> oder ähnliche SFINAE Tricks braucht man nur, wenn man z.B. mehrere Überladungen einer Funktion hat, von denen einige (oder alle) nur für bestimmte Typen funktionieren sollen.<br />
In so einem Fall würde der Code oben nicht mehr funktionieren, da der Fehler in meinem Beispiel erst im Funktionsrumpf auftritt, und das ist für SFINAE zu spät.<br />
(Bei SFINAE muss der Fehler bereits beim &quot;Instanzieren&quot; des Prototyps auftreten. Nur in dem Fall wird der Fehler dann nicht als Fehler gewertet, und das Template statt dessen einfach aus der Overload-Liste entfernt.)</p>
<p>(Ich bitte um Korrektur falls das nicht stimmt bzw. nicht ausreichend genau formuliert ist, aber ich meine es sollte inetwa hinkommen :))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408125</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 11 Jul 2014 05:09:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Kindklasse die von Template-Klasse erbt on Fri, 11 Jul 2014 05:14:06 GMT]]></title><description><![CDATA[<p>Wobei <code>bool</code> erschreckenderweise sowohl <code>is_arithmetic</code> als auch <code>numeric_limits&lt;T&gt;::is_specialized</code> ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408126</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 11 Jul 2014 05:14:06 GMT</pubDate></item></channel></rss>