<?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[Funktionsobjekte: gleich zwei blöde Fragen]]></title><description><![CDATA[<p>Hi,</p>
<p>habe mir gerade ein Beispiel zu Funktoren in Zusammenhang mit der STL angeschaut und habe gleich zwei blöde Fragen dazu. Hier zunächst der Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &quot;conio.h&quot;

struct ungerade : public unary_function&lt;int, bool&gt;
{
	bool operator()(int x) const
	{
		return (x%2) != 0;
	}
};

int main()
{
	int i;
	std::cout &lt;&lt; &quot;int eingeben: &quot;;
	std::cin &gt;&gt; i;
	if(ungerade()(i)) // (*)
		std::cout &lt;&lt; i &lt;&lt; &quot; ist ungerade&quot;;
	if(not1(ungerade())(i))
		std::cout &lt;&lt; i &lt;&lt; &quot; ist gerade&quot;;

	_getch();
	return 0;
}
</code></pre>
<p>Jetzt die Fragen:<br />
1. In Zeile (*) kann ich mich nicht ganz mit der doppelten Klammer nach &quot;ungerade&quot; anfreunden. Ist &quot;ungerade()&quot; ein Konstruktoraufruf, um anschließend mittels des temporären &quot;ungerade-Objekts&quot; zu testen, ob i ungerade ist?</p>
<p>2. Sowohl für die Basisklasse von ungerade, unary_function, als auch die Methode not1 wird laut MSDN-library der header &lt;functional&gt; benötigt. Wenn ich den wie oben geschehen per include einfüge, will der Compiler trotzdem nichts von unary_function und not1 wissen. Was mache ich hier falsch?</p>
<p>Danke vorab,<br />
Nanuq</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170825/funktionsobjekte-gleich-zwei-blöde-fragen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 08:07:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170825.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jan 2007 19:10:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Fri, 19 Jan 2007 19:10:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe mir gerade ein Beispiel zu Funktoren in Zusammenhang mit der STL angeschaut und habe gleich zwei blöde Fragen dazu. Hier zunächst der Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &quot;conio.h&quot;

struct ungerade : public unary_function&lt;int, bool&gt;
{
	bool operator()(int x) const
	{
		return (x%2) != 0;
	}
};

int main()
{
	int i;
	std::cout &lt;&lt; &quot;int eingeben: &quot;;
	std::cin &gt;&gt; i;
	if(ungerade()(i)) // (*)
		std::cout &lt;&lt; i &lt;&lt; &quot; ist ungerade&quot;;
	if(not1(ungerade())(i))
		std::cout &lt;&lt; i &lt;&lt; &quot; ist gerade&quot;;

	_getch();
	return 0;
}
</code></pre>
<p>Jetzt die Fragen:<br />
1. In Zeile (*) kann ich mich nicht ganz mit der doppelten Klammer nach &quot;ungerade&quot; anfreunden. Ist &quot;ungerade()&quot; ein Konstruktoraufruf, um anschließend mittels des temporären &quot;ungerade-Objekts&quot; zu testen, ob i ungerade ist?</p>
<p>2. Sowohl für die Basisklasse von ungerade, unary_function, als auch die Methode not1 wird laut MSDN-library der header &lt;functional&gt; benötigt. Wenn ich den wie oben geschehen per include einfüge, will der Compiler trotzdem nichts von unary_function und not1 wissen. Was mache ich hier falsch?</p>
<p>Danke vorab,<br />
Nanuq</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212877</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Fri, 19 Jan 2007 19:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Fri, 19 Jan 2007 19:13:06 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>1. In Zeile (*) kann ich mich nicht ganz mit der doppelten Klammer nach &quot;ungerade&quot; anfreunden. Ist &quot;ungerade()&quot; ein Konstruktoraufruf, um anschließend mittels des temporären &quot;ungerade-Objekts&quot; zu testen, ob i ungerade ist?</p>
</blockquote>
<p>Ja. Normalerweise macht man für sowas aber auch keine Funktoren, eher wenn die Funktion dahinter &quot;stateful&quot; ist, also im Funktor Informationen gespeichert sind die beim nächsten Aufruf benötigt werden.</p>
<blockquote>
<p>2. Sowohl für die Basisklasse von ungerade, unary_function, als auch die Methode not1 wird laut MSDN-library der header &lt;functional&gt; benötigt. Wenn ich den wie oben geschehen per include einfüge, will der Compiler trotzdem nichts von unary_function und not1 wissen. Was mache ich hier falsch?</p>
</blockquote>
<p>Sowohl unary_function als auch not1 befinden sich genau wie cout und cin im Namespace std.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212880</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 19 Jan 2007 19:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Fri, 19 Jan 2007 19:17:49 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort!</p>
<p>Dann war ja eigentlich doch nur eine der beiden Fragen doof, die dafür aber ganz besonders:</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Sowohl unary_function als auch not1 befinden sich genau wie cout und cin im Namespace std.</p>
</blockquote>
<p><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/1212885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212885</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Fri, 19 Jan 2007 19:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Sat, 20 Jan 2007 07:58:02 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Nanuq schrieb:</p>
<blockquote>
<p>1. In Zeile (*) kann ich mich nicht ganz mit der doppelten Klammer nach &quot;ungerade&quot; anfreunden. Ist &quot;ungerade()&quot; ein Konstruktoraufruf, um anschließend mittels des temporären &quot;ungerade-Objekts&quot; zu testen, ob i ungerade ist?</p>
</blockquote>
<p>Ja. Normalerweise macht man für sowas aber auch keine Funktoren, eher wenn die Funktion dahinter &quot;stateful&quot; ist, also im Funktor Informationen gespeichert sind die beim nächsten Aufruf benötigt werden.</p>
</blockquote>
<p>Naja, als Template Parameter braucht man öfters Funktoren. Ganz egal ob man im Funktor nun State braucht oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213055</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Jan 2007 07:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Sat, 20 Jan 2007 13:15:40 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja, als Template Parameter braucht man öfters Funktoren. Ganz egal ob man im Funktor nun State braucht oder nicht.</p>
</blockquote>
<p>Wie meinst Du das? Geht doch auch mit Funktionen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

template &lt;typename F&gt; struct caller_t { caller_t(F f) { f(); } };

template &lt;typename F&gt; void call(F f) { caller_t&lt;F&gt; c(f); }

struct functor_t { void operator ()() { cout &lt;&lt; &quot;functor_t&quot; &lt;&lt; endl; } };

void functor() { cout &lt;&lt; &quot;functor&quot; &lt;&lt; endl; }

int main()
{
    call(functor_t());
    call(functor);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1213159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213159</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 20 Jan 2007 13:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Sat, 20 Jan 2007 14:47:04 GMT]]></title><description><![CDATA[<p>Nachdem ihr hier eifrig diskutiert, klinke ich mich vielleicht doch noch einmal ein.</p>
<p>Kann man sagen, dass Funktoren Funktionszeiger ersetzen (können/sollten) und zusätzlich den Vorteil haben, dass sie als Objekte z.B. Daten speichern können?</p>
<p>Und kann man außerdem sagen, dass Funktoren hauptsächlich im Zusammenhang mit solchen Callback-Mechanismen (etwas wie im Beispiel von Konrad Rudolph nennt man doch so, oder?) eingesetzt werden?</p>
<p>Ich denke, dass ich inzwischen die Theorie verstanden habe, allerdings sehe ich - abgesehen von Callback-Funktionen - die praktischen Einsatzmöglichkeiten noch nicht wirklich. Vielleicht kann mir ja auch jemand sagen, wo man über den <strong>praktischen</strong> Einsatz etwas nachlesen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213202</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Sat, 20 Jan 2007 14:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekte: gleich zwei blöde Fragen on Mon, 22 Jan 2007 08:27:03 GMT]]></title><description><![CDATA[<p>Ein Vorteil von Funktoren ist, daß sie ein eigenständiger Typ sind. Das heißt, du kannst sie z.B. als Parameter an Template-Klassen übergeben (z.B. std::set&lt;&gt; und Kollegen erwarten einen Funktor als zweiten bzw. dritten Parameter).<br />
(ja, man könnte auch eine <code>set&lt;double,bool(*)(double,double)&gt;</code> definieren, aber mit Funktoren kannst du hier wesentlich eleganter umgehen)</p>
<p>Ein anderer Vorteil ist, daß sie interne Daten speichern können, z.B.:</p>
<pre><code class="language-cpp">struct mittelwert : public unary_function&lt;double,void&gt;
{
  mittelwert() : sum(0),count(0) {}

  //Funktions-Operator
  void operator()(double val)
  {
    sum+=val;
    ++count;
  }

  //Ausgabe des Ergebnisses
  operator double() {return sum/count;}

private:
  double sum;
  size_t count;
};

...
vector&lt;double&gt; data;
...
mittelwert mw=for_each(data.begin(),data.end(),mittelwert());
cout&lt;&lt;&quot;Der Mittelwert ist &quot;&lt;&lt;mv&lt;&lt;endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1214222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1214222</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 22 Jan 2007 08:27:03 GMT</pubDate></item></channel></rss>