<?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: Vergleicherklasse durch Funktion ersetzten]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn man Templates verwendet kann man ja auch immer eine Vergleicherklasse mitangeben lassen, die zwei Objekte miteinander vergleicht:<br />
z.B.</p>
<pre><code class="language-cpp">struct cmp_str 
{
   bool operator()(char const *a, char const *b) 
   {
      return std::strcmp(a, b) &lt; 0;
   }
};

...
template &lt;class Temp, class Comp&gt;
...
</code></pre>
<p>Gibt es denn auch die Möglichkeit statt einer Klasse eine Funktion (vielleicht sogar eine Memberfunktion, die auf Membervariablen auch noch zugreift) zu übergeben? Die Version &quot;template &lt;class Temp, class Comp&gt;&quot; liefert einen Compilerfehler wenn man eine Funktion übergibt und &quot;template &lt;class Temp, function Comp&gt;&quot; funktioniert auch nicht.</p>
<p>Gibt es noch ne andere Möglichkeit?</p>
<p>Viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251134/template-vergleicherklasse-durch-funktion-ersetzten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 12:38:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251134.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Sep 2009 16:36:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Tue, 29 Sep 2009 16:36:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn man Templates verwendet kann man ja auch immer eine Vergleicherklasse mitangeben lassen, die zwei Objekte miteinander vergleicht:<br />
z.B.</p>
<pre><code class="language-cpp">struct cmp_str 
{
   bool operator()(char const *a, char const *b) 
   {
      return std::strcmp(a, b) &lt; 0;
   }
};

...
template &lt;class Temp, class Comp&gt;
...
</code></pre>
<p>Gibt es denn auch die Möglichkeit statt einer Klasse eine Funktion (vielleicht sogar eine Memberfunktion, die auf Membervariablen auch noch zugreift) zu übergeben? Die Version &quot;template &lt;class Temp, class Comp&gt;&quot; liefert einen Compilerfehler wenn man eine Funktion übergibt und &quot;template &lt;class Temp, function Comp&gt;&quot; funktioniert auch nicht.</p>
<p>Gibt es noch ne andere Möglichkeit?</p>
<p>Viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786101</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Tue, 29 Sep 2009 16:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Tue, 29 Sep 2009 16:46:53 GMT]]></title><description><![CDATA[<p>Normalerweise ist es dann der Funktionstyp (bzw. Funktionszeigertyp), der als Templateparameter angegeben wird. Die Funktion selber wird per Argument (z.B. im Konstruktor) übergeben.</p>
<p>Bei <code>std::set</code> kann das zum Beispiel so aussehen:</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;string&gt;

bool CompareStrings(const std::string&amp; Left, const std::string&amp; Right)
{
	return Left &lt; Right;
}

int main()
{
	// Mit Typedef:
	typedef bool (*Function)(const std::string&amp;, const std::string&amp;);
	std::set&lt;std::string, Function&gt; Set(&amp;CompareStrings);

	// Oder direkt:
	std::set&lt;std::string, bool (*)(const std::string&amp;, const std::string&amp;)&gt; Set2(&amp;CompareStrings);
}
</code></pre>
<p>Ist also je nach Fall recht hässlich, aber trotzdem möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786115</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Sep 2009 16:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Tue, 29 Sep 2009 17:30:24 GMT]]></title><description><![CDATA[<p>Und für Memberfunktionen kannst du mem_fun (<a href="http://www.cplusplus.com/reference/std/functional/mem_fun/" rel="nofollow">http://www.cplusplus.com/reference/std/functional/mem_fun/</a>) bzw. mem_fun_ref verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786159</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 29 Sep 2009 17:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Wed, 30 Sep 2009 13:18:52 GMT]]></title><description><![CDATA[<p>Hallo, erstmal vielen Dank für die Antworten!!!</p>
<p>Hab leider mit Funktionsobjekten und co. noch nicht gearbeitet, versuche mich deshalb gerade in mem_fun einzuarbeiten.</p>
<p>Hätte aber einmal ne Frage dazu:</p>
<p>Ich kann ja auch schreiben:</p>
<pre><code class="language-cpp">std::set&lt;int, std::less&lt;int&gt; &gt;
</code></pre>
<p>Ist std::less nicht sogar der Standard, wenn man nichts angibt?</p>
<p>Zumindest frage ich mich wie die Implementierung nun mit diesem Operator ein Objekt wiederfinden will. Ich meine mit std::less kann man zwar ein Array sortieren, aber wie finde ich heraus ob das Objekt wirklich vorhanden ist? Wenn less false liefert, dann kann es ja auch immer noch größer sein - wie macht das z.B. std::set dann um die Methode find anzubieten?</p>
<p>Auf jeden Fall schonmal vielen Dank,</p>
<p>viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786486</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Wed, 30 Sep 2009 13:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Wed, 30 Sep 2009 14:01:32 GMT]]></title><description><![CDATA[<p>Wenn man einen &lt;-Operator zur Verfügung hat (durch less) kann man alle anderen Vergleichsoperatoren nachbilden:</p>
<p>a &gt;= b &lt;==&gt; !(a &lt; b)<br />
a == b &lt;==&gt; a &gt;= b &amp;&amp; b &gt;= a<br />
a &gt; b &lt;==&gt; a &gt;= b &amp;&amp; !(a == b)<br />
a &lt;= b &lt;==&gt; !(a &gt; b)</p>
<p>(Vom Prinzip her, kann man bestimmt noch vereinfachen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786513</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 30 Sep 2009 14:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Wed, 30 Sep 2009 16:08:27 GMT]]></title><description><![CDATA[<p>Hi, stimmt hast recht - wenn mans so sieht kann man auch mit &lt; alles ausdrücken, thx!!</p>
<p>Ich hab mir das Tuturium auf <a href="http://www.cpp-tutor.de/cpp/le18/functors.html" rel="nofollow">http://www.cpp-tutor.de/cpp/le18/functors.html</a> durchgelesen und wollte jetzt für std::set meine eigene Vergleichs-Funktion schreiben:</p>
<pre><code class="language-cpp">class Testen
{
public:

	int Wert;

	bool Vergleicher2(int arg1, int arg2)
	{
		return (arg1 &lt; Wert &amp;&amp; arg2 &lt; Wert);
	}

	void ausprobieren()
	{
		Wert = 4;
		std::set&lt;int, std::mem_fun&lt;bool, int&gt;(&amp;Vergleicher2)&gt; hallo;
	}	
};
</code></pre>
<p>Das macht jetzt zwar noch keinen Sinn sollte aber halt ein Test für eine Memberfunktion sein, die auch noch auf Membervariablen zugreift.</p>
<p>Leider liefert das ganz viele Compilerfehler, die ich noch nicht kenne:</p>
<p>l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2770: Ungültige explizite template-Argumente für &quot;std::const_mem_fun1_t&lt;_Result,_Ty,_Arg&gt; std::mem_fun(_Result (__thiscall _Ty::* )(_Arg) const)&quot;.<br />
l:\programme\visual 2008\vc\include\functional(598): Siehe Deklaration von 'std::mem_fun'<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2770: Ungültige explizite template-Argumente für &quot;std::const_mem_fun_t&lt;_Result,_Ty&gt; std::mem_fun(_Result (__thiscall _Ty::* )(void) const)&quot;.<br />
l:\programme\visual 2008\vc\include\functional(589): Siehe Deklaration von 'std::mem_fun'<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2770: Ungültige explizite template-Argumente für &quot;std::mem_fun1_t&lt;_Result,_Ty,_Arg&gt; std::mem_fun(_Result (__thiscall _Ty::* )(_Arg))&quot;.<br />
l:\programme\visual 2008\vc\include\functional(581): Siehe Deklaration von 'std::mem_fun'<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2770: Ungültige explizite template-Argumente für &quot;std::mem_fun_t&lt;_Result,_Ty&gt; std::mem_fun(_Result (__thiscall _Ty::* )(void))&quot;.<br />
l:\programme\visual 2008\vc\include\functional(573): Siehe Deklaration von 'std::mem_fun'<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2133: 'hallo': Unbekannte Größe<br />
l:\meine visual projekte\avl2\avl2\avl2.cpp(70) : error C2512: 'std::set': Kein geeigneter Standardkonstruktor verfügbar</p>
<p>Wenn ich &lt;bool, int&gt; hinter mem_fun weglasse klappt es leider auch nicht.</p>
<p>Was muss ich ändern, damit es klappt?</p>
<p>Viele Grüße</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786565</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Wed, 30 Sep 2009 16:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Wed, 30 Sep 2009 17:07:48 GMT]]></title><description><![CDATA[<p>arrrr.<br />
war unsinn.<br />
sorry.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786586</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Sep 2009 17:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Thu, 01 Oct 2009 08:49:47 GMT]]></title><description><![CDATA[<p>Hattest du gedacht du hättest den Fehler gefunden und hast das dann hinterher nochmal umeditiert oder wie darf ich das verstehen?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786780</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Thu, 01 Oct 2009 08:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Vergleicherklasse durch Funktion ersetzten on Mon, 05 Oct 2009 10:00:41 GMT]]></title><description><![CDATA[<p>ich hab den fehler gefunden, bin dann aber draufgekommen dass mein vorschlag zur korrektur auch falsch war, und hatte keine zeit mehr das zu korrigieren und ausruprobieren.</p>
<p>der fehler ist ziemlich offensichtlich: std::mem_fun ist kein typ, sondern eine helper-funktion (genauer: eine gruppe von gleichnamigen funktions-templates) zum erstellen von instanzen verschiedener typen.</p>
<p>so in der art müsste es gehen, aber hab ich jetzt auch ausprobiert:</p>
<pre><code class="language-cpp">std::set&lt;int, std::mem_fun2_t&lt;Testen, bool, int, int&gt; &gt; hallo(std::mem_fun&lt;bool, int, int&gt;(&amp;Testen::Vergleicher2, this));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1788202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788202</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Oct 2009 10:00:41 GMT</pubDate></item></channel></rss>