<?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] functor]]></title><description><![CDATA[<p>Für Sort bei ner Liste bieten sich Funktoren an.</p>
<p>z.B.:</p>
<pre><code class="language-cpp">class Klasse
{
public:
int val1, val2;
}
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">struct compareVal1
{
  bool operator()(const Klasse&amp; ref1, const Klasse&amp; ref1) 
  { return a.val1&lt; b.val1; }
};
struct compareVal2
{
  bool operator()(const Klasse&amp; ref1, const Klasse&amp; ref1) 
  { return a.val2&lt; b.val2; }
};
</code></pre>
<p>okay, soweit so gut. Alternativ läßt sich auch der Vergleichsoperator überladen, wobei der sich nur für eine Vergleichssorte überschreiben läßt (val1 oder val2, oder man verbockt sich dass irgendwie mit if anweisungen...)</p>
<p>naja, nun hängen viele kleine zusätzliche structs rum. meist mache ich daraus nested classes, damit man sie besser zurordnen kann.</p>
<p>aber kann man das ganze nich tirgendwie in ein template packen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189618/template-functor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 11:08:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189618.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Aug 2007 07:40:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 07:40:49 GMT]]></title><description><![CDATA[<p>Für Sort bei ner Liste bieten sich Funktoren an.</p>
<p>z.B.:</p>
<pre><code class="language-cpp">class Klasse
{
public:
int val1, val2;
}
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">struct compareVal1
{
  bool operator()(const Klasse&amp; ref1, const Klasse&amp; ref1) 
  { return a.val1&lt; b.val1; }
};
struct compareVal2
{
  bool operator()(const Klasse&amp; ref1, const Klasse&amp; ref1) 
  { return a.val2&lt; b.val2; }
};
</code></pre>
<p>okay, soweit so gut. Alternativ läßt sich auch der Vergleichsoperator überladen, wobei der sich nur für eine Vergleichssorte überschreiben läßt (val1 oder val2, oder man verbockt sich dass irgendwie mit if anweisungen...)</p>
<p>naja, nun hängen viele kleine zusätzliche structs rum. meist mache ich daraus nested classes, damit man sie besser zurordnen kann.</p>
<p>aber kann man das ganze nich tirgendwie in ein template packen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344753</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 07:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 07:46:55 GMT]]></title><description><![CDATA[<p>Eigentlich sind Pointer ja erlaubt als Template-Parameter - ob das auch für Member-Zeiger gilt, bin ich mir nicht 100% sicher. Wenn ja, könnte folgendes funktionieren:</p>
<pre><code class="language-cpp">template&lt;int (Klasse*::Member)&gt;//ich hoffe, die Syntax hier ist richtig
struct compare
{
  bool operator()(const Klasse&amp;r,const Klasse&amp;l)
  { return r.*Member &lt; l.*Member; }
};

sort(l.begin(),l.end(),compare&lt;&amp;Klasse::val1&gt;());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344754</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Aug 2007 07:46:55 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 08:01:10 GMT]]></title><description><![CDATA[<p>Wenn das nicht gehen sollte (habs nicht ausprobiert), kann man die Memberpointer aber noch zur Laufzeit übergeben:</p>
<pre><code class="language-cpp">template&lt; typename T, typename MemT &gt;
struct CompareValT
{
        typedef MemT ( T::*member_type );

        bool operator()( T const&amp; lhs, T const&amp; rhs )
        {
                return lhs.*m_member &lt; rhs.*m_member;
        }

        CompareValT( member_type member ): m_member( member ) {}

private:
        member_type m_member;
};

template&lt; typename T, typename MemT &gt;
CompareValT&lt; T, MemT &gt; CompareVal( MemT (T::*member) )
{
        return CompareValT&lt; T, MemT &gt;( member );
}

using namespace std;

int main()
{
        vector&lt; Klasse &gt; k;
        sort( k.begin(), k.end(), CompareVal( &amp;Klasse::Val1 ) );
        sort( k.begin(), k.end(), CompareVal( &amp;Klasse::Val2 ) );
}
</code></pre>
<p>Die Funktion CompareVal dient nur dazu sich die automatische Deduktion der Templateparameter zunutze zu machen <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>EDIT:<br />
CStolls Version funktioniert natürlich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344761</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 15 Aug 2007 08:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 08:03:09 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;int (Klasse*::Member)&gt;//ich hoffe, die Syntax hier ist richtig
</code></pre>
</blockquote>
<p>fast <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>
<pre><code class="language-cpp">template&lt;int (Klasse::*Member)&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344763</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Wed, 15 Aug 2007 08:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 08:41:21 GMT]]></title><description><![CDATA[<p>alles klar... werde das gleich mal testen.</p>
<p>Danke</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: die Version klappt aber nur für int-Werte, oder? bzw. wie schaut das ganze bei floats oder double werten aus, die nach wie vor noch nicht bei templates erlaubt sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344785</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 08:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 08:50:05 GMT]]></title><description><![CDATA[<p>Auch wenn ich nicht CStoll bin...</p>
<p>muffmolch schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: die Version klappt aber nur für int-Werte, oder? bzw. wie schaut das ganze bei floats oder double werten aus, die nach wie vor noch nicht bei templates erlaubt sind?</p>
</blockquote>
<p>Hier ist weder int, noch double, noch float ein Templateparameter. Der Templateparameter ist ein (Methoden-)Zeiger und könnte auch auf eine Memberfunktion zeigen, die ein float, string und Point entgegennimmt und einen vector&lt; tuple&lt; char, short, int, long &gt; &gt; zurückgibt (Achtung: Beispiel überzogen :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344793</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 15 Aug 2007 08:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 08:52:19 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: die Version klappt aber nur für int-Werte, oder? bzw. wie schaut das ganze bei floats oder double werten aus, die nach wie vor noch nicht bei templates erlaubt sind?</p>
</blockquote>
<p>Ja, das war auch auf das wesentliche beschränkt - natürlich kannst du die übrigen Bestandteile auch als Template-Parameter festlegen:</p>
<pre><code class="language-cpp">template&lt;typename K, typename M, M (K::*Member)&gt;
struct Compare
{...};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344797</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Aug 2007 08:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:01:47 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Hier ist weder int, noch double, noch float ein Templateparameter. Der Templateparameter ist ein (Methoden-)Zeiger und könnte auch auf eine Memberfunktion zeigen, die ein float, string und Point entgegennimmt und einen vector&lt; tuple&lt; char, short, int, long &gt; &gt; zurückgibt (Achtung: Beispiel überzogen :D)</p>
</blockquote>
<p>Oehm nein. Der Template-Parameter ist ein Zeiger namens Member, der auf einen int innerhalb der Klasse namens Klasse zeigt. Dein Beispiel wuerde so aussehen:</p>
<pre><code class="language-cpp">template&lt; vector&lt; tuple&lt; char, short, int, long &gt; &gt; (MeineKlasse::(*Member)(float, string, Point)) &gt;

//oder schoener:
typedef vector&lt; tuple&lt; char, short, int, long &gt; &gt; Ergebnis;
typedef Ergebnis MeineKlasse::(*KrasserFktPtr)(float, string, Point);
template&lt;KrasserFktPtr Member&gt;
</code></pre>
<p>Der template-parameter ist nich &quot;irgendein&quot; Pointer, sondern ein Pointer eines bestimmten Typs. Und diesen Typ gibst du mit an. Um etwas weniger kompizierte Beispiele zu verwenden, folgendes ist verschieden:</p>
<pre><code class="language-cpp">template &lt;void* ptr&gt; //Zeiger auf void, wer haetts gedacht
template &lt;int* pInt&gt;
template &lt;void (*fktPtr)()&gt; //zeiger auf Funktion mit Rueckgabe void ohne parameter
template &lt;int C::*memPtr&gt; //zeiger auf int in Klasse C, siehe CStolls Bsp
template &lt;void C::(*memFktPtr)()&gt; //zeiger auf void-Funktion ohne Parameter in KLasse C
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344801</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:09:29 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Oehm nein. Der Template-Parameter ist ein Zeiger namens Member, der auf einen int innerhalb der Klasse namens Klasse zeigt. Dein Beispiel wuerde so aussehen</p>
</blockquote>
<p>Du hast recht, es ist kein &quot;Methodenzeiger&quot;, sondern ein &quot;Memberzeiger&quot;. An dem Rest halte ich jedoch fest (ändert ja nichts daran dass ein Zeiger auf ein float-Member immernoch ein konstanter Zeiger und damit ein gültiger Templateparameter ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344807</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:32:33 GMT]]></title><description><![CDATA[<p>Gut, mein missverstaendnis. Nach genauerem Nachlesen schein muffmolch CStolls Besipiel als int-Parameter verstanden zu haben und nicht als member-pointer-to-int.<br />
CStolls Antwirt gibt aber dann eigentlich alles was noetig ist, abgesehn von einer kleinen Unschoenheit: Es wird Information wiederholt, naemlich ueber die Klasse und ueber den Zieltyp des Pointers. Es muesste einen Mechanismus geben, um aus dem Pointer allein die Klasse und den Zieltyp zu extrahieren, so dass die Angabe von K und M unnoetig ist.</p>
<p>Nur wie? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344821</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:45:15 GMT]]></title><description><![CDATA[<p>nein ich hatte es genau so verstanden, wie CStoll geschrieben hat. pointer auf ein int-member... laßt mich da raus <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/1344832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344832</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:47:29 GMT]]></title><description><![CDATA[<p>*alles zurueck nehm* Bin ja schon still <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344834</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:51:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: schon okay.</p>
<p>dann sollte das ganze auch mit get-Methoden funktionieren, wenn man eh nur Funktionspointer übermittelt. Sehe ich das richtig? also wenn z.B. kein direkter Zugriff auf die Member klasse möglich ist und man die friend deklaierung vermeiden möchte:</p>
<pre><code class="language-cpp">class Klasse
{
public: 
   ...
   double getVal1();
   double getVal2();
   ...
private:
   double val1,val2;
</code></pre>
<p>also in etwas so:</p>
<pre><code class="language-cpp">template&lt;typename K, typename M, M (K::*fct)&gt; 
struct compare 
{ 
  bool operator()(const K&amp;r,const K&amp;l) 
  { return r.*fct&lt; l.*fct; } 
}; 

sort(l.begin(),l.end(),compare&lt;Klasse, &amp;Klasse::getVal1&gt;());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344836</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:55:45 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename K, typename M, M (K::*fct)()&gt;  //die Klammern hinten machen den unterschied zwischen Funktion und normalem Member
struct compare 
{ 
  bool operator()(const K&amp;r,const K&amp;l) 
  { return r.(*fct)()&lt; l.(*fct)(); }   //hier bedeuten die Klammern den Aufruf des opertor(), im Funktionspointer-Fall also der entsprechenden Funktion
};
</code></pre>
</blockquote>
<p>Da fehlten Funktionsklammern an 3 Stellen, sonst duerfte es aber so funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344842</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 09:58:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Ja, ich hätte mir auch gewünscht, das alles auf einen Parameter zu reduzieren, aber das gibt C++ nicht her. Und eine Hilfsfunktion wie LordJaxom's CompareVal() lässt sich auch nicht einsetzen, weil nicht-Typ Parameter nur beschränkt erkannt werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344844</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Aug 2007 09:58:15 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:17:40 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Ja, ich hätte mir auch gewünscht, das alles auf einen Parameter zu reduzieren, aber das gibt C++ nicht her.</p>
</blockquote>
<p>Wartmal. geht nicht sowas:</p>
<pre><code class="language-cpp">template &lt;class C, typename M&gt;
sruct compare {
  typedef M C::*MemPtr;
  compare(MemPtr ptr) : mp_(ptr);
  bool operator()(C&amp; l, C&amp; r) {return l.(*mp_) &lt; m.(*mp_);}
private:
  MemPtr mp_;
};

template &lt;class C, typename M&gt; //template argument deduction
compare&lt;C,M&gt; make_compare(M C::*ptr) {compare&lt;C,M&gt; cmp(ptr); return cmp}

sort(l.begin(),l.end(),make_compare(&amp;Klasse::Member));
</code></pre>
<p>Wupp, schon muesste es gehn...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344852</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:15:19 GMT]]></title><description><![CDATA[<p>Und um das Ganze noch etwas voranzutreiben:</p>
<pre><code class="language-cpp">template&lt;class C, typename E&gt;
struct fkt_compare {
  typedef M C::(*MemFktPtr)();
  compare(MemFktPtr ptr) : mfp_(ptr);
  bool operator()(C&amp; l, C&amp; r) {return l.(*mp_)() &lt; m.(*mp_)();}
private:
  MemPtr mfp_;
};

template &lt;class C, typename M&gt; //template argument deduction again
fkt_compare&lt;C,M&gt; make_compare(M C::(*ptr)()) {fkt_compare&lt;C,M&gt; fcmp(ptr); return fcmp}
</code></pre>
<p>Damit kann make_compare auch ein Funktionspointer uebergeben werden, gleichzeitiges Ueberladen von Funktionstemplate mit template argument deduction <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344854</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:29:16 GMT]]></title><description><![CDATA[<p>Ja, das geht - und das hat LordJaxom schon genannt. Bei <em>meiner</em> Variante ist es allerdings nicht so einfach, die argument deduction auszunutzen, weil der letzte Parameter nicht zur Compilezeit ermittelt werden kann (und <code>template&lt;M K::*Member&gt;...</code> scheitert aran, daß der Compiler M und K nicht kennt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344859</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:31:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: meinst du das?</p>
<pre><code class="language-cpp">class Klasse{
public:
   Klasse(int val1, int val2 ) : val1(val1),val2(val2) {}
//   int getVal1() const { return val1; }
//   int getVal2() const { return val2; }
//private:
   int val1, val2;
};
template&lt;typename K, typename M, M (K::*Member)&gt; 
struct compareMember 
{ 
   bool operator()(const K &amp;r, const K &amp;l) 
   { return r.*Member &lt; l.*Member; } 
}; 
int main(){
   list&lt;Klasse&gt; l;
   l.push_back(Klasse(10,10));
   l.push_back(Klasse(1,5));
   l.push_back(Klasse(50,3));
   sort(l.begin(),l.end(),compareMember&lt;Klasse, int,  &amp;Klasse::val1&gt;());
};
</code></pre>
<p>endet in folgendes compilerfehlermeldungen:</p>
<blockquote>
<p>C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2784: 'reverse_iterator&lt;_RanIt&gt;::difference_type std::operator -(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : could not deduce template argument for 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' from 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : see declaration of 'std::operator -'<br />
F:\LBM_subversion\source\lbmd2q9\a2pII\testcases\inputfileSerial\main.cpp(57) : see reference to function template instantiation 'void std::sort&lt;std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;,compareMember&lt;K,M,Member&gt;&gt;(_RanIt,_RanIt,_Pr)' being compiled<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true,<br />
K=Klasse,<br />
M=int,<br />
Member=pointer-to-member(0x0),<br />
_RanIt=std::list&lt;Klasse&gt;::_Iterator&lt;true&gt;,<br />
_Pr=compareMember&lt;Klasse,int,pointer-to-member(0x0)&gt;<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2784: 'reverse_iterator&lt;_RanIt&gt;::difference_type std::operator -(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : could not deduce template argument for 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' from 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : see declaration of 'std::operator -'<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2784: 'reverse_iterator&lt;_RanIt&gt;::difference_type std::operator -(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : could not deduce template argument for 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' from 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : see declaration of 'std::operator -'<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2784: 'reverse_iterator&lt;_RanIt&gt;::difference_type std::operator -(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : could not deduce template argument for 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' from 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;'<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : see declaration of 'std::operator -'<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2676: binary '-' : 'std::list&lt;_Ty&gt;::_Iterator&lt;_Secure_validation&gt;' does not define this operator or a conversion to a type acceptable to the predefined operator<br />
with<br />
[<br />
_Ty=Klasse,<br />
_Secure_validation=true<br />
]<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3261) : error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff)' : expects 3 arguments - 4 provided<br />
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3085) : see declaration of 'std::_Sort'</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1344860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344860</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:37:35 GMT]]></title><description><![CDATA[<p>sort() erwartet Random-Access-Iteratoren, aber list&lt;&gt; hat &quot;nur&quot; bidirektionale Iteratoren (und der Compiler scheitert dabei, einen operator- für list-Iteratoren zu finden).</p>
<p>Also entweder du verwendest einen anderen Container (vector&lt;&gt; oder deque&lt;&gt;) oder du nutzt die list-Methode sort():</p>
<pre><code class="language-cpp">l.sort(compareMember&lt;Klasse, int,  &amp;Klasse::val1&gt;());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344864</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:37:35 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 10:48:13 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ich vollhonk... klaro... war vor lauter deduction ganz verwirrt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344877</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 10:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 11:43:03 GMT]]></title><description><![CDATA[<p>okay. mit den membern klappt es nun. sehr gut. aber der methoden vergleich scheitert noch:</p>
<pre><code class="language-cpp">class Klasse{
public:
   Klasse(double val1, double val2 ) : val1(val1),val2(val2) {}
   double getVal1() const { return val1; }
   double getVal2()       { return val2; }
private:
   double val1, val2;
};
template&lt;typename K, typename M, M (K::*fct)()&gt;  
struct compareMethods{ 
   bool operator()(const K&amp; r, const K&amp; l) 
   { return r.(*fct)() &lt; l.(*fct)();  }   
}; 
int main(int argc, char** argv)
{
   list&lt;Klasse&gt; l;
   l.push_back(Klasse(10,10));
   l.push_back(Klasse(1,5));
   l.sort(compareMethods&lt;Klasse, double,  &amp;Klasse::getVal1 &gt;() );
   l.sort(compareMethods&lt;Klasse, double,  &amp;Klasse::getVal2 &gt;() );
}
</code></pre>
<p>Fehler:</p>
<blockquote>
<p><strong>//Fuer l.sort( compareMethods&lt;Klasse, double, &amp;Klasse::getVal1 &gt;() ):</strong><br />
1&gt;main.cpp error C2440: 'specialization' : cannot convert from 'overloaded-function' to 'double (__thiscall Klasse::* )(void)'<br />
<strong>//Fuer l.sort(compareMethods&lt;Klasse, double, &amp;Klasse::getVal2 &gt;() ):</strong><br />
1&gt;main.cpp error C2059: syntax error : '(' <em>bei { return r.(*fct)() &lt; l.(*fct)();</em> 1&gt;while compiling class template member function 'bool compareMethods&lt;K,M,fct&gt;::operator ()(const K &amp;,const K &amp;)'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; K=Klasse,<br />
1&gt; M=double,<br />
1&gt; fct=Klasse::getVal2<br />
1&gt; ]<br />
1&gt;main.cpp (56) : see reference to class template instantiation 'compareMethods&lt;K,M,fct&gt;' being compiled<br />
1&gt; with<br />
1&gt; [<br />
1&gt; K=Klasse,<br />
1&gt; M=double,<br />
1&gt; fct=Klasse::getVal2<br />
1&gt; ]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1344891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344891</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 11:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 11:43:03 GMT]]></title><description><![CDATA[<p>Zum ersten Fall: &lt;ratemodus&gt;fct ist ein Pointer zu einer non-const Funktion. Ich vermute, dass der Compiler Probleme damit hat, ihn mit einen const K anzuwenden. template&lt;...., M (K::*fct)() const&gt; oder sowas in der Art koennte evtl. helfen &lt;/ratemodus&gt;</p>
<p>Zum zweiten Fall: Die Klammern um *fct waren Bloedsinn von mir. Dadurch wird der Member-Pointer_Zugriffsoperator .* zerlegt. Mein Fehler, sry...<br />
also</p>
<pre><code class="language-cpp">return r.*fct() &lt; l.*fct();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1344923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344923</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 11:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 11:55:54 GMT]]></title><description><![CDATA[<p>auch nach der entfernung der klammern: gleicher fehler...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344950</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 11:55:54 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 12:01:15 GMT]]></title><description><![CDATA[<p>Gnarf ^^<br />
hab mal in mein schlaues buch geschut, da wurden pointer-to-mem-fun's so aufgerufen:</p>
<pre><code class="language-cpp">return (r.*fct)() &lt; (l.*fct)();
</code></pre>
<p>Vermutlich muss der linke AUsdruck geklammert werden, damit er erst dessen Rueckgabewert bestimmt (naemlich die Funktion fuer ein spezielles Obejkt), und danach erst den operator() drauf anwendet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344959</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 15 Aug 2007 12:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to [template] functor on Wed, 15 Aug 2007 12:05:57 GMT]]></title><description><![CDATA[<p>kannst du es dann kompilieren? denn dann bekomme ich diesen Fehler:</p>
<blockquote>
<p>error C2440: 'argument' : cannot convert from 'const Klasse *' to 'Klasse *const '<br />
Conversion loses qualifiers</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1344968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344968</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 15 Aug 2007 12:05:57 GMT</pubDate></item></channel></rss>