<?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[Alternative für &amp;quot;virtual template&amp;quot;]]></title><description><![CDATA[<p>Ich habe eine Klasse:</p>
<pre><code>class A {
    template &lt;class Iterator&gt;
    unsigned hashFunction(Iterator begin, Iterator end) {
        // ...
    }

    template &lt;class Iterator&gt;
    void doSomething(Iterator begin, Iterator end) {
        // viel Code, in dem u.a. hashFunction aufgerufen wird
    }
};
</code></pre>
<p>Ich möchte jetzt eine zweite Klasse B schreiben, die quasi von A erbt, bei der aber eine andere &quot;hashFunction&quot;-Implementierung verwendet wird. Die doSomething-Implementierung soll so bleiben wie bei A. Beim Aufruf von doSomething auf einem B-Objekt soll dann natürlich die hashFunction-Implementierung von B verwendet werden.</p>
<p>Wären die beiden Methoden keine Templates, würde ich hashFunction als virtual deklarieren und alles wäre gut.</p>
<p>Was gibt es in meinem Fall für Alternativen?</p>
<p>Das einzige was mir gerade einfällt, ist die doSomething-Implementierung von A nach B zu kopieren. Das ist ziemlich unschön, vor allem, wenn man doSomething mal ändern möchte...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328860/alternative-für-quot-virtual-template-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 05:33:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328860.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Oct 2014 19:59:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Alternative für &amp;quot;virtual template&amp;quot; on Wed, 29 Oct 2014 19:59:35 GMT]]></title><description><![CDATA[<p>Ich habe eine Klasse:</p>
<pre><code>class A {
    template &lt;class Iterator&gt;
    unsigned hashFunction(Iterator begin, Iterator end) {
        // ...
    }

    template &lt;class Iterator&gt;
    void doSomething(Iterator begin, Iterator end) {
        // viel Code, in dem u.a. hashFunction aufgerufen wird
    }
};
</code></pre>
<p>Ich möchte jetzt eine zweite Klasse B schreiben, die quasi von A erbt, bei der aber eine andere &quot;hashFunction&quot;-Implementierung verwendet wird. Die doSomething-Implementierung soll so bleiben wie bei A. Beim Aufruf von doSomething auf einem B-Objekt soll dann natürlich die hashFunction-Implementierung von B verwendet werden.</p>
<p>Wären die beiden Methoden keine Templates, würde ich hashFunction als virtual deklarieren und alles wäre gut.</p>
<p>Was gibt es in meinem Fall für Alternativen?</p>
<p>Das einzige was mir gerade einfällt, ist die doSomething-Implementierung von A nach B zu kopieren. Das ist ziemlich unschön, vor allem, wenn man doSomething mal ändern möchte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2424772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2424772</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Wed, 29 Oct 2014 19:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative für &amp;quot;virtual template&amp;quot; on Wed, 29 Oct 2014 20:30:15 GMT]]></title><description><![CDATA[<pre><code>template&lt;class Iterator&gt;
class A {
    virtual unsigned hashFunction(Iterator begin, Iterator end) {
        // ...
    }

    void doSomething(Iterator begin, Iterator end) {
        // viel Code, in dem u.a. hashFunction aufgerufen wird
    }
};
</code></pre>
<p>und jetzt ableiten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2424780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2424780</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Wed, 29 Oct 2014 20:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative für &amp;quot;virtual template&amp;quot; on Wed, 29 Oct 2014 20:36:13 GMT]]></title><description><![CDATA[<p>Oder type erasure auf den Iterator machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2424783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2424783</guid><dc:creator><![CDATA[löscher]]></dc:creator><pubDate>Wed, 29 Oct 2014 20:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative für &amp;quot;virtual template&amp;quot; on Wed, 29 Oct 2014 21:03:50 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<pre><code>template&lt;class Iterator&gt;
class A {
    virtual unsigned hashFunction(Iterator begin, Iterator end) {
        // ...
    }
 
    void doSomething(Iterator begin, Iterator end) {
        // viel Code, in dem u.a. hashFunction aufgerufen wird
    }
};
</code></pre>
<p>und jetzt ableiten</p>
</blockquote>
<p>Und was ist, wenn ich doSomething mit verschiedenen Iterator-Instanzen auf demselben A-Objekt verwenden will? -&gt; geht so nicht.</p>
<p>Type Erasure guck ich mir mal an.</p>
<p>Edit:<br />
Ich glaube, ich habe eine Lösung gefunden, die meinen Bedürfnissen entspricht:<br />
Ich lager die hashFunction aus und übergebe sie als Template-Parameter:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

template &lt;template &lt;class&gt; class hashFunction&gt;
struct A {
    template &lt;class Iterator&gt;
    unsigned doSomething(Iterator begin, Iterator end) {
        hashFunction&lt;Iterator&gt; h;
        return h(begin, end);
    }

};

template &lt;class X&gt;
struct hash {
    unsigned operator()(X a, X b) {
        return b - a;
    }
};

template &lt;class X&gt;
struct hash2 {
    unsigned operator()(X a, X b) {
        return 2*(b - a);
    }
};

int main() {
    A&lt;hash&gt; a;
    A&lt;hash2&gt; b;
    std::vector&lt;int&gt; v(10);
    std::cout &lt;&lt; a.doSomething(v.begin(), v.end()) &lt;&lt; std::endl;
    std::cout &lt;&lt; b.doSomething(v.begin(), v.end()) &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2424788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2424788</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Wed, 29 Oct 2014 21:03:50 GMT</pubDate></item></channel></rss>