<?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[templates, functoren, virtual]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe ne klasse Sorter, von der verschiedene sortieralgorithmen ableiten und die abstrakte virtuelle funktion DoSort ueberschreiben um dort das sortierverfahren zu implementieren. zur zeit sortieren alle aufsteigend. um nun auch nach anders sortieren zu können (absteigend oder nach anderen kriterien) wollte ich die klasse um eine functor erweitern (siehe unten) den ich dann beim aufruf uebergebe und der den vergleich uebernimmt.</p>
<p>problem ist nun das virtual von DoSort. mein compiler mosert rum, das virtual und template (template &lt;typename Functor&gt; nicht zusammen funktionieren. aber ohne diese kann ich ja den functor nicht an die ableitende klasse uebergeben.</p>
<p>wie löse ich dieses problem am besten?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Sorter
{
  protected:

    // elemente vertauschen
    virtual void Swap(T *a, T *b);

    template &lt;typename Functor &gt;
    virtual void DoSort(T *Left, T *Right, Functor Compare) = 0;

  public:

    template &lt;typename Functor &gt;
    void Sort(T *Left, T *Right, Functor Compare);
};
</code></pre>
<pre><code class="language-cpp">// Shell-Sort
template &lt;typename T&gt;
class ShellSorter : public Sorter&lt;T&gt;
{
  protected:

//    void DoSort(T *Left, T *Right);

    template &lt;typename Functor&gt;
    void DoSort(T *Left, T *Right, Functor Compare);
};
</code></pre>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Less
{
  public:

    // Funktionsoperator
    bool operator () (const T &amp;lhs, const T &amp;rhs) const 
    { 
      return (lhs &lt; rhs); 
    }
};
</code></pre>
<p>p.s. gleich vorne weg nein ich will kein std::sort verwenden! <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/topic/123557/templates-functoren-virtual</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 14:58:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123557.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Oct 2005 06:57:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 07:25:32 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe ne klasse Sorter, von der verschiedene sortieralgorithmen ableiten und die abstrakte virtuelle funktion DoSort ueberschreiben um dort das sortierverfahren zu implementieren. zur zeit sortieren alle aufsteigend. um nun auch nach anders sortieren zu können (absteigend oder nach anderen kriterien) wollte ich die klasse um eine functor erweitern (siehe unten) den ich dann beim aufruf uebergebe und der den vergleich uebernimmt.</p>
<p>problem ist nun das virtual von DoSort. mein compiler mosert rum, das virtual und template (template &lt;typename Functor&gt; nicht zusammen funktionieren. aber ohne diese kann ich ja den functor nicht an die ableitende klasse uebergeben.</p>
<p>wie löse ich dieses problem am besten?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Sorter
{
  protected:

    // elemente vertauschen
    virtual void Swap(T *a, T *b);

    template &lt;typename Functor &gt;
    virtual void DoSort(T *Left, T *Right, Functor Compare) = 0;

  public:

    template &lt;typename Functor &gt;
    void Sort(T *Left, T *Right, Functor Compare);
};
</code></pre>
<pre><code class="language-cpp">// Shell-Sort
template &lt;typename T&gt;
class ShellSorter : public Sorter&lt;T&gt;
{
  protected:

//    void DoSort(T *Left, T *Right);

    template &lt;typename Functor&gt;
    void DoSort(T *Left, T *Right, Functor Compare);
};
</code></pre>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Less
{
  public:

    // Funktionsoperator
    bool operator () (const T &amp;lhs, const T &amp;rhs) const 
    { 
      return (lhs &lt; rhs); 
    }
};
</code></pre>
<p>p.s. gleich vorne weg nein ich will kein std::sort verwenden! <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/894711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894711</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Tue, 18 Oct 2005 07:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 07:12:49 GMT]]></title><description><![CDATA[<p>Das Problem dürfte sein, daß du eine &quot;normale&quot; Funktion durch ein Template überlädst. Ohne Garantie für die Richtigkeit:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Sorter
{
  protected:

    // elemente vertauschen
    virtual void Swap(T *a, T *b);

    template&lt;typename Functor&gt;
    virtual void DoSort(T *Left, T *Right, Functor Compare) = 0;

  public:

    template&lt;typename Functor&gt;
    void Sort(T *Left, T *Right, Functor Compare);
};
</code></pre>
<p>Wenn das nicht funktioniert, kannst du höchstens noch &quot;typename Functor=Less&lt;T&gt;&quot; als zweiten Parameter der Sorter-Klasse angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894726</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Oct 2005 07:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 07:26:10 GMT]]></title><description><![CDATA[<p>sorry hab das beim copy/paste vergessen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894751</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Tue, 18 Oct 2005 07:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 07:36:41 GMT]]></title><description><![CDATA[<p>In dem Fall dürfte es wirklich ein Konflikt zwischen statischer und dynamischer Zuordnung sein. Templates sind von Natur aus statisch, d.h. sie <strong>müssen</strong> zur Compilezeit zugeordnet werden. Virtuelle Funktionen sind dynamisch und <strong>können</strong> erst zur Laufzeit richtig zugeordnet werden. Damit bleiben dir nur drei grundsätzliche Möglichkeiten:<br />
a) du verzichtest auf die &quot;Virtualität&quot;<br />
b) du verschiebst den &quot;Functor&quot;-Parameter auf Klassenebene (bin nicht sicher, ob das möglich ist):</p>
<pre><code class="language-cpp">template&lt;typename T,typename Functor=Less&lt;T&gt;
struct sorter{...}
</code></pre>
<p>c) du baust dir einen Vergleichsoperator, der (halb)dynamisch sein Verhalten ändern kann:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class compare{
  const bool less;
public:
  compare(bool n_less) : less(n_less) {}
  bool operator()(const T&amp; lhs,const T&amp; rhs) const
  { return less ? lhs&lt;rhs : lhs&gt;rhs; }
}

//...
mySorter.Sort(start,end,compare&lt;char&gt;(true));//sortiere char's steigend
mySorter.Sort(start,end,compare&lt;char&gt;(false));//sortiere char's fallend
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/894768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894768</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Oct 2005 07:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 07:42:10 GMT]]></title><description><![CDATA[<p>okay, mit dem 2. parameter gehts jetzt, habe aber dann solche konstrukte beim aufruf...</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Greater
{
  public:

    // Funktionsoperator
    bool operator () (const T &amp;lhs, const T &amp;rhs) const 
    { 
      return (lhs &gt; rhs); 
    }
};

aiLibBasics::Greater&lt;int&gt;       G;
ShellSorter&lt;int, Greater&lt;int&gt; &gt; S;

S.Sort(Liste + 0, Liste + LaengeListe - 1, G);
</code></pre>
<p>ist das so gedacht oder stehe ich heute nur extrem aufm schlauch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894780</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Tue, 18 Oct 2005 07:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to templates, functoren, virtual on Tue, 18 Oct 2005 09:22:19 GMT]]></title><description><![CDATA[<p>Sunday schrieb:</p>
<blockquote>
<p>hi,<br />
ich habe ne klasse Sorter, von der verschiedene sortieralgorithmen ableiten</p>
</blockquote>
<p>schlechte idee.<br />
klassen, die keine attribute haben und nur eine methode, sind eigentlich funktionen. also mach auch funktionen.<br />
die dann per funktor-wrapper in eine liste stecken, wird ein anderes (einfaches) problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/894866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/894866</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 18 Oct 2005 09:22:19 GMT</pubDate></item></channel></rss>