<?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 Vererbung]]></title><description><![CDATA[<p>Hi,</p>
<p>was ich machen will, ist als Templateparameter nur Klassen zulassen, die von einer bestimmten Basisklasse erben, da sie bestimmte funktionen bereitstellen müssen.<br />
Also irgendwie sowas:<br />
template &lt;class T(MyBaseKlass)&gt; ...</p>
<p>Google gibt bei den Stichworten Template/Vererbung immer nur die Frage aus, wie man von einer Templateklasse erben könnte, was aber nicht mein Problem ist.</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290906/template-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 01:31:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290906.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Aug 2011 10:56:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 10:56:52 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>was ich machen will, ist als Templateparameter nur Klassen zulassen, die von einer bestimmten Basisklasse erben, da sie bestimmte funktionen bereitstellen müssen.<br />
Also irgendwie sowas:<br />
template &lt;class T(MyBaseKlass)&gt; ...</p>
<p>Google gibt bei den Stichworten Template/Vererbung immer nur die Frage aus, wie man von einer Templateklasse erben könnte, was aber nicht mein Problem ist.</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102573</guid><dc:creator><![CDATA[Mathews]]></dc:creator><pubDate>Sat, 06 Aug 2011 10:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 10:58:19 GMT]]></title><description><![CDATA[<p>Wozu würdest du das denn brauchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102575</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 06 Aug 2011 10:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:02:57 GMT]]></title><description><![CDATA[<p>Was mich momentan juckt ist z.B. die Möglichkeit einer Hashtabelle, sodass die Keys somit nicht immer eine eigene Hash-berechnungs-klasse bräuchte, sondern die hashValue() methode selbst implementieren könnte, was meiner Meinung nach halt viel schöner aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102580</guid><dc:creator><![CDATA[Mathews]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:10:42 GMT]]></title><description><![CDATA[<p>Kommst du aus Java? Dann vergiss mal schnell alles. Templates können mehr als Generics, wenn du willst, dass ein Typ hashValue() implementiert, dann setz das voraus und verwende das einfach.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void blah(const T&amp; value)
{
    std::cout &lt;&lt; value.hashValue(); // Wenn T hashValue() implementiert, funktionierts, wenn nicht -&gt; Compiler-Fehler
}
</code></pre>
<p>Übrigens: Eine Hashtabelle gibts in C++ schon. Heißt im aktuellen Standard std::tr1::unordered_map und im kommenden std::unordered_map.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102586</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:10:54 GMT]]></title><description><![CDATA[<p>Würde sich warscheinlich etwas mit std::enable_if bauen lassen, vorausgesetzt ich behalte Recht in der Annahme dass es etwas wie derived_of gibt. <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/2102588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102588</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:12:38 GMT]]></title><description><![CDATA[<p>Mal schnell zusammengefleddert:</p>
<pre><code class="language-cpp">template&lt;typename T,
         std::size_t assert_hashValue_function = sizeof(static_cast&lt;T*&gt;(0)-&gt;hashValue())&gt;
struct accept_only_hashables {
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2102591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102591</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:12:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:17:24 GMT]]></title><description><![CDATA[<p>Übrigens: Einer der Gründe, warum man ein hash&lt;&gt; template gemacht hat, war, dass man damit auch built-in Typen unterstützen kann. In deine Hashtabelle kann man keine ints, longs, bools, etc speichern <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/2102595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102595</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:22:35 GMT]]></title><description><![CDATA[<p>Kann man mit SFINAE machen, daß hash&lt;T&gt; automatisch alle Klassen mit .hashValue() unterstützt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102599</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:25:34 GMT]]></title><description><![CDATA[<p>Mathews schrieb:</p>
<blockquote>
<p>die von einer bestimmten Basisklasse erben, da sie bestimmte funktionen bereitstellen müssen.</p>
</blockquote>
<p>Um bestimmte Funktionen bereitzustellen, muss man nicht von einer Klasse erben. Google mal nach &quot;compiletime polymorphism&quot;.<br />
Wenn sie die Funktion besitzen müssen, dann benutze die Funktion einfach, und der Compiler meckert genau dann, wenn dein Templateparameter die Funktion nicht unterstützt.</p>
<p>Du könntest für eine klarere Fehlermeldung eine Metafunktion schreiben, die prüft, ob es ein entsprechendes Member gibt, aber das brauchst du nicht unbedingt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102604</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:25:34 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 11:36:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>super, das funktioniert so einfach <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="🙂"
    /><br />
Die std::unordered_map kenne ich, ich wollte mir mehr so eine Wrapper-Hashtable bauen, die halt mit der Funktion hashValue() arbeitet.<br />
(Sonst brauche ich wie gesagt jedes mal eine eigene Klasse und ein einfaches<br />
Hashtable&lt;Key,Value&gt; ist halt imo irgendwie angenehmer zu benutzen.^^)</p>
<p>Btw: richtig erkannt mit dem java.</p>
<p>Danke für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102610</guid><dc:creator><![CDATA[Mathews]]></dc:creator><pubDate>Sat, 06 Aug 2011 11:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 12:08:29 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Kann man mit SFINAE machen, daß hash&lt;T&gt; automatisch alle Klassen mit .hashValue() unterstützt?</p>
</blockquote>
<p>Ungetestet:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct hash&lt;T, std::size_t = sizeof(static_cast&lt;T*&gt;(0)-&gt;hashValue())&gt;
{
    std::size_t operator () (const T&amp; value)
    {
        return value.hashValue();
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2102617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102617</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 06 Aug 2011 12:08:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 16:50:54 GMT]]></title><description><![CDATA[<p>Ich halte das Vorgehen für albern. Sinnvollerweise ist ein Hash eine Eigenschaft einer Wertemenge, nicht eines Werttyps. Der Klasse eine Hash-Funktion zu geben macht die Verwendung einer Hashmap zwar etwas bequemer, aber die Art und Weise, auf die diese Bequemlichkeit entsteht, lädt geradezu dazu ein, einen Hash zu verwenden, der auf die Wertemenge überhaupt nicht passt. Auf die Art wird man den durch die Hashmap erwarteten Performancegewinn leicht mehr als los.</p>
<p>Deswegen hat std::tr1::unordered_map auch einen Template-Parameter, über den man einen sinnvollen Hash übergeben kann.</p>
<p>Wenn du wirklich der Meinung bist, du solltest den Hash an den Typ ketten (und das solltest du dir ein zweites Mal genauer überlegen), schreib halt stumpf</p>
<pre><code class="language-cpp">template&lt;typename T&gt; struct java_hash : public std::unary_function&lt;T, std::size_t&gt; {
  std::size_t operator()(T const &amp;val) const { return val.hash_value(); }
};

...

typedef std::tr1::unordered_map&lt;key, value, java_hash&lt;key&gt; &gt; key_value_javamap;

// bzw.

template&lt;typename key_t, typename value_t&gt;
struct java_map { typedef std::tr1::unordered_map&lt;key_t, value_t, java_hash&lt;key_t&gt; &gt; type; };

java_map&lt;A, B&gt;::type my_map;

// bzw. mit C++11

template&lt;typename key_t, typename value_t&gt;
using java_map = std::unordered_map&lt;key_t, value_t, java_hash&lt;key_t&gt;&gt;;

java_map&lt;A, B&gt; my_map;
</code></pre>
<p>oder etwas in der Art.</p>
<p>Was Pis Vorschlag angeht, partielle Spezialisierungen im Namensraum std sind nicht standardkonform. Auch bestünde damit die Gefahr, sich mit anderen Bibliotheken zu beißen, die eine ähnliche Idee hatten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102707</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Aug 2011 16:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 16:56:15 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">: public std::unary_function&lt;T, std::size_t&gt;
</code></pre>
</blockquote>
<p>Soweit ich weiß, ist std::unary_function mit C++11 als deprecated vermerkt.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Was Pis Vorschlag angeht, partielle Spezialisierungen im Namensraum std sind nicht standardkonform. Auch bestünde damit die Gefahr, sich mit anderen Bibliotheken zu beißen, die eine ähnliche Idee hatten.</p>
</blockquote>
<p>Ich kann aber meine hash-Klasse als template-Parameter übergeben <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/2102711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102711</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 06 Aug 2011 16:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 17:11:02 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ungetestet:</p>
</blockquote>
<p>hm. ja.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct hash&lt;T, std::size_t = sizeof(static_cast&lt;T*&gt;(0)-&gt;hashValue())&gt;
{
    std::size_t operator () (const T&amp; value)
    {
        return value.hashValue();
    }
}
</code></pre>
</blockquote>
<p>Was soll das überhaupt sein? Eine partielle Spezialisierung mit Defaultparameter??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102714</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 06 Aug 2011 17:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 17:15:31 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Ich halte das Vorgehen für albern. Sinnvollerweise ist ein Hash eine Eigenschaft einer Wertemenge, nicht eines Werttyps. Der Klasse eine Hash-Funktion zu geben macht die Verwendung einer Hashmap zwar etwas bequemer, aber die Art und Weise, auf die diese Bequemlichkeit entsteht, lädt geradezu dazu ein, einen Hash zu verwenden, der auf die Wertemenge überhaupt nicht passt. Auf die Art wird man den durch die Hashmap erwarteten Performancegewinn leicht mehr als los.</p>
</blockquote>
<p>Was? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was soll den eine Wertemenge bzw. ein Werttyp sein? Kannst du das z.B. mal an einem Hash für Strings erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102715</guid><dc:creator><![CDATA[???????...]]></dc:creator><pubDate>Sat, 06 Aug 2011 17:15:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 19:11:28 GMT]]></title><description><![CDATA[<p>???????... schrieb:</p>
<blockquote>
<p>Was? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Was soll den eine Wertemenge bzw. ein Werttyp sein? Kannst du das z.B. mal an einem Hash für Strings erklären?</p>
</blockquote>
<p>Das kam zwar nicht von mir, aber normalerweise landet nur eine Teilmenge aller technisch möglichen Werte in deiner Hash-Tabelle. Und je nachdem wo die Schwerpunkte liegen, kann eine andere Hashfunktion günstiger sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102748</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 06 Aug 2011 19:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vererbung on Sat, 06 Aug 2011 20:26:29 GMT]]></title><description><![CDATA[<p>Am einfachen Beispiel erklärt:</p>
<p>Angenommen, ich will double-Werte speichern. Ich entwerfe einen einfachen Hash für den erwarteten Wertebereich, etwa</p>
<pre><code class="language-cpp">std::size_t hash(double x) {
  return static_cast&lt;std::size_t&gt;((x - x_min) / (x_max - x_min) * std::numeric_limits&lt;std::size_t&gt;::max() + .5);
}
</code></pre>
<p>was, wenn ich jetzt keinen Programmierfehler gemacht habe, für gleichverteilte Werte wunderbar funktioniert.</p>
<p>Jetzt erwarte ich aber beispielsweise normalverteilte oder gar lognormal verteilte Werte (ich mache beispielsweise eine Monte-Carlo-Simulation über Aktienkurse oder etwas in der Art), und es stellt sich ziemlich schnell heraus, dass diese auf den ersten Blick sehr vernünftige Hashfunktion - die für gleichverteilte Wertmengen in der Tat vernünftig wäre - selbst bei sehr geringem Load-Faktor der Hashtable dauernd kollidiert, und als wäre das nicht genug, dass sie dauernd in der selben Gegend kollidiert und sich die Positionen der Werte entsprechend stark verschieben (jetzt mit closed hashing gedacht, das ist hier ja üblich).</p>
<p>Was man daraus sehen kann, ist, dass es wenig Sinn macht, eine Hashfunktion für double zu definieren und diese überall zu benutzen. Es ist nicht sinnvoll, die Hashfunktion an den Werttyp (im Sinne von Datentyp) zu binden, sondern man muss eine für die erwartete Wertemenge sinnvolle Hashfunktion benutzen. Gleiches gilt für alle anderen Datentypen. Speichere ich beispielsweise Strings, ist bei zufälligen Eingaben eine andere Funktion sinnvoll, als wenn ich die Funktionsnamen einer C-Bibliothek speichere, die als Namensraumersatz alle mit den gleichen n Zeichen anfangen. Speichere ich eine Punktmenge, macht es einen Unterschied, was diese beschreibt.</p>
<p>Es ist nunmal so, dass Hashing nicht ganz trivial ist. Wenn du einfach hinschreiben willst &quot;mach mir etwas, was x nach y mappt&quot;, bist du mit std::map besser dran - da hast du Worst-Case-Garantien. Wenn sich das als Performanceproblem entpuppt, können Hashtables die Lösung sein, <strong>aber nur, wenn man sich die Arbeit macht, das Hashing vernünftig hinzukriegen.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102766</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Aug 2011 20:26:29 GMT</pubDate></item></channel></rss>