<?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[Erben von Template-Parameter]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>in einem anderen Thread habe ich folgenden Beispielcode gesehen:</p>
<pre><code class="language-cpp">template&lt;T&gt; 
class C : private T { 
//...
};
</code></pre>
<p>Mir ist klar, was es bewirkt, allerdings fehlt mir irgendwie ein Anwendungsbeispiel,<br />
das mir dieses (potentiell) interessante Konstrukt näher bringt.<br />
In welchem Fall muss man denn von einem Templateparameter erben?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243908/erben-von-template-parameter</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 15:38:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243908.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Jun 2009 18:24:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 18:25:03 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>in einem anderen Thread habe ich folgenden Beispielcode gesehen:</p>
<pre><code class="language-cpp">template&lt;T&gt; 
class C : private T { 
//...
};
</code></pre>
<p>Mir ist klar, was es bewirkt, allerdings fehlt mir irgendwie ein Anwendungsbeispiel,<br />
das mir dieses (potentiell) interessante Konstrukt näher bringt.<br />
In welchem Fall muss man denn von einem Templateparameter erben?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731206</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 22 Jun 2009 18:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 19:42:36 GMT]]></title><description><![CDATA[<p>Das nennt sich CRTP und eignet sich für Mixins oder für statische Polymorphie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731254</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 22 Jun 2009 19:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 20:39:14 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Das nennt sich CRTP und eignet sich für Mixins oder für statische Polymorphie.</p>
</blockquote>
<p>Nein das nennt sich nicht CRTP, das nennt sich &quot;ganz normales Klassen-Template mit einem Parameter welcher als (private) Basisklasse verwendet wird&quot;. <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>DAS DA nennt sich CRTP:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class Base
{
public:
    void Foo()
    {
        static_cast&lt;T*&gt;(this)-&gt;Bar();
    }
};

class Derived : public Base&lt;Derived&gt;
{
public:
    void Bar();
};
</code></pre>
<p>@CSpille:<br />
Da hier die Basisklasse &quot;T&quot; privat ist, kann man davon ausgehen, dass sie Funktionen implementiert, auf die das Template dann zugreift, um irgendwas zu machen.</p>
<p>Vermutlich könnte das Klassen-Template &quot;T&quot; genauso als Member anlegen, statt privat zu erben.</p>
<p>Ein Beispiel wo &quot;T&quot; wirklich als (private!) Basisklasse nötig wäre, fällt mir grad nicht ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731275</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 22 Jun 2009 20:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 20:46:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ein Beispiel wo &quot;T&quot; wirklich als (private!) Basisklasse nötig wäre, fällt mir grad nicht ein.</p>
</blockquote>
<p>Stichwort Policy Based Design:<br />
Die Klasse erbt von ihrer Basisklasse ein bestimmtes Verhalten, das sie in der Implementierung ihrer Methoden benutzt. Meist kann das auch durch Kapselung eines Objekts vom Typ T erreicht werden, allerdings kann bei Vererbung die Empty Base Optimization ausgenutzt werden, wenn die Policy-Klasse wirklich nur Verhalten und keine Daten beinhaltet. Beispiel:</p>
<pre><code class="language-cpp">template &lt;class EggCrackerPolicy&gt;
class PanCakeBaker : private EggCrackerPolicy
{
public:
  Pancake bakeTheCake()
  {
    crackTheEggs();
    /* ... */
  };
};

struct GentlyEggCracker
{
  void crackTheEggs() { smoothTickTick(); }
};

struct BrutalEggCracker
{
  void crackTheEggs() { throwThemAtTheWall(); }
};

int main()
{
  PanCakeBaker&lt;BrutalEggCracker&gt; baker1; 
  Pancake firstcake = baker1.bakeTheCake(); //might have pieces of eggshell in it

  PanCakeBaker&lt;GentlyEggCracker&gt; baker2;
  Pancake secondcake = baker2.bakeTheCake(); //much better
}
</code></pre>
<p>*SCNR* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731282</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 22 Jun 2009 20:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 21:24:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
OK.<br />
Das ist dann eine Optimierung, aber keine Notwendigkeit zu erben.</p>
<p>Fällt dir auch ein Beispiel ein wo es notwendig wäre zu erben, also wo ein &quot;T&quot; Member einfach nicht gehen würde?</p>
<p>p.S.: wenn T leer ist, dann könnte man doch einfach alle Funktionen static machen, anstatt sich auf die &quot;empty base class optimidings&quot; zu verlassen, nicht? Das wäre doch viel einfacher, und vor allem viel klarer, da dann keiner stundenlang grübelt, wieso Vererbung verwendet wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731302</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 22 Jun 2009 21:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 21:44:20 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;class EggCrackerPolicy&gt;
class PanCakeBaker : private EggCrackerPolicy
{
public:
  Pancake bakeTheCake()
  {
    crackTheEggs();
    /* ... */
  };
};
</code></pre>
</blockquote>
<p>Kleine Korrektur: Es müsste</p>
<pre><code class="language-cpp">this-&gt;crackTheEggs();
</code></pre>
<p>heißen, damit der Compiler auch weiß, dass das eine Elementfunktion sein soll.</p>
<p>Zum Thema: Mir fällt auf Anhieb auch kein Beispiel ein, wo es mehr als eine Optimierung wäre -- Optimierung im Sinne von Speicherverbrauch; denn, wenn <code>T</code> leer ist, sollte bei einem guten Compiler die Klasse <code>C&lt;T&gt;</code> , welche von <code>T</code> erbt, nicht unnötig größer werden. Diese &quot;empty base class optimization&quot; ist aber optional. Ein Compiler darf auch Platz verschwenden. Wenn T stattdessen als Element in <code>C&lt;T&gt;</code> aufgenommen wird, muss für dieses Element mindestens ein char &quot;verbraten&quot; werden weil es nicht die gleiche Addresse wie ein anderes Objekt besitzen darf.</p>
<p>Eine Anwendung, wo es als Optimierung Sinn macht: &quot;Deleter&quot; für einen schlauen Zeiger. Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
  struct default_deleter
  { void del(T* ptr) {delete ptr;} };

  template&lt;typename T&gt;
  struct default_deleter&lt;T[]&gt;
  { void del(T* ptr) {delete[] ptr;} };

  template&lt;typename T, std::size_t N&gt;
  struct default_deleter&lt;T[N]&gt;
  { void del(T* ptr) {delete[] ptr;} };

  template&lt;typename T, class Deleter = default_deleter&lt;T&gt; &gt;
  class unique_ptr : private Deleter
  {
    T* ptr;
    ....
    ~unique_ptr() {this-&gt;del(ptr);}
    ....
    T&amp; operator*() const {return *ptr;}
    T* operator-&gt;() const {return ptr;}
  };
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731308</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 22 Jun 2009 21:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Mon, 22 Jun 2009 22:14:16 GMT]]></title><description><![CDATA[<p>Jopp, ist mir grad selbst auch eingefallen. Es gibt ja Fälle, wo leere Policy-Klassen vorkommen <em>können</em> (und u.U. sogar sehr oft vorkommen), diese aber nicht leer sein <em>müssen</em>.</p>
<p>Dann macht es natürlich Sinn privat abzuleiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731313</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 22 Jun 2009 22:14:16 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Tue, 23 Jun 2009 05:18:17 GMT]]></title><description><![CDATA[<p>Meine Hauptquelle zum Thema Policy Based Design ist bisher Alexandrescus <em>Modern C++ Design</em> - muss da bei Gelegenheit mal nachschauen was er als Gründe für die Ableitung an Stelle der Kapselung angibt.</p>
<p>In den <em>C++ Coding Standards</em> geben er und Sutter folgende mögliche Gründe für nichtöffentliche Vererbung von T an:</p>
<ul>
<li>Wenn man virtuelle Funktionen überschreiben muss</li>
<li>Wenn man Zugriff auf protected Member braucht</li>
<li>Wenn das benutzte Objekt vor einer Basisklasse konstruiert oder nach ihr zerstört werden muss</li>
<li>Im Zusammenhang mit virtuellen Basisklassen</li>
<li>Wenn man weiß dass die EBO greift</li>
<li>Kontrollierter Polymorphismus - für friends ist die Klasse ein T</li>
</ul>
<p>Was die Unterstützung der EBO angeht: <a href="http://www.cantrip.org/emptyopt.html" rel="nofollow">hier</a> wird angegeben, welche häufig benutzten Compiler die EBO unterstützen - mittlerweile die meisten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731346</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 23 Jun 2009 05:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Tue, 23 Jun 2009 07:17:19 GMT]]></title><description><![CDATA[<p>Der Artikel ist von 1997. Was soll uns das jetzt sagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731382</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 23 Jun 2009 07:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Tue, 23 Jun 2009 07:23:53 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Der Artikel ist von 1997. Was soll uns das jetzt sagen?</p>
</blockquote>
<p>Es sollte mir sagen, was eine EBO ist. Aber ich hab's nicht gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731388</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 23 Jun 2009 07:23:53 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Tue, 23 Jun 2009 07:56:43 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Der Artikel ist von 1997. Was soll uns das jetzt sagen?</p>
</blockquote>
<p>Es sollte mir sagen, was eine EBO ist. Aber ich hab's nicht gefunden.</p>
</blockquote>
<p>Nein. Es sollte nur sagen dass bereits 1997, also vor dem Standard bereits die meisten Compiler die EBO unterstützten. (siehe letzter Abschnitt und Nachträge im Artikel)</p>
<p>Was eine EBO ist kann Google schnell sagen, unter den ersten Links ist z.B. folgendes:<br />
<a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=319" rel="nofollow">http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=319</a><br />
<a href="http://www.gotw.ca/publications/mill07.htm" rel="nofollow">http://www.gotw.ca/publications/mill07.htm</a><br />
<a href="http://books.google.de/books?id=EotSAwuBkJoC&amp;pg=PA289&amp;lpg=PA289&amp;dq=Empty+Base+Class+Optimization&amp;source=bl&amp;ots=iwK0K6-hae&amp;sig=GYU-qNKS8Mdx8XP1TEJlnc3Pt08&amp;hl=de&amp;ei=eYhASv2JH4iqsAa3hvXACA&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=9" rel="nofollow">http://books.google.de/books?id=EotSAwuBkJoC&amp;pg=PA289&amp;lpg=PA289&amp;dq=Empty+Base+Class+Optimization&amp;source=bl&amp;ots=iwK0K6-hae&amp;sig=GYU-qNKS8Mdx8XP1TEJlnc3Pt08&amp;hl=de&amp;ei=eYhASv2JH4iqsAa3hvXACA&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=9</a></p>
<p>Auch da sind wieder einige uralt-Artikel dabei, was umso mehr zeigt dass man sich heute kaum noch Gedanken darüber zu machen braucht, ob ein verwendeter Compiler das auch wirklich kann.</p>
<p>Gedacht war das Ganze als Antwort auf folgenden Satz (sry dass ich das nicht mit zitiert habe):</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>p.S.: wenn T leer ist, dann könnte man doch einfach alle Funktionen static machen, anstatt sich auf die &quot;empty base class optimidings&quot; zu verlassen, nicht? Das wäre doch viel einfacher, und vor allem viel klarer, da dann keiner stundenlang grübelt, wieso Vererbung verwendet wird...</p>
</blockquote>
<p>Mein Fazit: Man kann sich getrost darauf verlassen dass die EBO greifen wird (und in den wenigen Fällen wo sie nicht greift schadet das Erben nicht), und man muss nicht stundenlang grübeln wieso Vererbung verwendet wird weil gerade bei der Ableitung von Templates von einem Templateparameter sehr häufig die EBO dahintersteckt, bzw. weil es einfac gängige Praxis ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731419</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 23 Jun 2009 07:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von Template-Parameter on Tue, 23 Jun 2009 09:03:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>&lt;übereilter Unfug&gt;</p>
</blockquote>
<p>Nein das nennt sich nicht CRTP, das nennt sich &quot;ganz normales Klassen-Template mit einem Parameter welcher als (private) Basisklasse verwendet wird&quot;. <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>DAS DA nennt sich CRTP: [...]</p>
</blockquote>
<p>Lektion: beantworte keine Posts, die du mangels Zeit nur überflogen hast, besonders nicht mit nur einem Satz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731448</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 23 Jun 2009 09:03:57 GMT</pubDate></item></channel></rss>