<?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[for_each für Memberfunktionen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne mal wissen ob folgendes eigentlich möglich ist, also ich habe es jedenfalls nicht hinbekommen.</p>
<p>Gegeben folgende Klassen</p>
<pre><code>class A{
  A();
  ...
};

class B{
  B();
  void fkt1();
  void fkt2(A&amp; A);

  std::vector&lt; A &gt; vec;
};
</code></pre>
<p>Kann man irgendwie von der Funktion fkt1() aus mittels for_each die fkt2() für jedes Element aus vec aufrufen?</p>
<p>Also etwas in der Art:</p>
<pre><code>void B::fkt1(){
  for_each(vec.begin(), vec.end(), fkt2);
}
</code></pre>
<p>Funktioniert natürlich so nicht, aber kann man das mit for_each ausdrücken, oder muss man eine for-Schleife schreiben und von Hand über den Vector iterieren?<br />
So wäre es natürlich auch möglich:</p>
<pre><code>for(unsigned int i=0; i&lt;vec.size(); ++i){
  fkt2(vec[i]);
}
</code></pre>
<p>Oder natürlich mit Iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226918/for_each-für-memberfunktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226918.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Nov 2008 15:45:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 15:45:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne mal wissen ob folgendes eigentlich möglich ist, also ich habe es jedenfalls nicht hinbekommen.</p>
<p>Gegeben folgende Klassen</p>
<pre><code>class A{
  A();
  ...
};

class B{
  B();
  void fkt1();
  void fkt2(A&amp; A);

  std::vector&lt; A &gt; vec;
};
</code></pre>
<p>Kann man irgendwie von der Funktion fkt1() aus mittels for_each die fkt2() für jedes Element aus vec aufrufen?</p>
<p>Also etwas in der Art:</p>
<pre><code>void B::fkt1(){
  for_each(vec.begin(), vec.end(), fkt2);
}
</code></pre>
<p>Funktioniert natürlich so nicht, aber kann man das mit for_each ausdrücken, oder muss man eine for-Schleife schreiben und von Hand über den Vector iterieren?<br />
So wäre es natürlich auch möglich:</p>
<pre><code>for(unsigned int i=0; i&lt;vec.size(); ++i){
  fkt2(vec[i]);
}
</code></pre>
<p>Oder natürlich mit Iteratoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611860</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 07 Nov 2008 15:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 15:47:49 GMT]]></title><description><![CDATA[<p>Weit davon entfernt, mich mit for_each auszukennen, möchte ich behaupten, dass wohl kein Weg daran vorbei führt, die Funktion mit Pointer oder Iterator aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611862</guid><dc:creator><![CDATA[TdZ]]></dc:creator><pubDate>Fri, 07 Nov 2008 15:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 16:01:18 GMT]]></title><description><![CDATA[<p><em>Edit: Sorry, hatte überlesen, dass es sich um Memberfunktionen handelt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611866</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 07 Nov 2008 16:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 16:09:27 GMT]]></title><description><![CDATA[<p>Da hilft dir entweder std::tr1::bind oder, wenn du keine TR1-Stdlib hast mit std::mem_fun und std::bind1st:</p>
<pre><code class="language-cpp">std::for_each(vec.begin(), vec.end(), std::tr1::bind(&amp;B::fkt2, this));
//oder
std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun(&amp;B::fkt2), *this));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1611876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611876</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 07 Nov 2008 16:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 16:16:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a>,<br />
Ich kenne mich mit dem std::tr1::bind nicht so genau aus, aber ich dachte, es wäre dem von Boost ähnlich bis gleich. Dann fehlt bei deinem Code nämlich noch was, denn mit Boost, geht es so:</p>
<pre><code class="language-cpp">std::for_each(vec.begin(), vec.end(), boost::bind(&amp;B::fkt2, this, _1));
</code></pre>
<p>Eine weitere Alternative gibt es auch noch:</p>
<pre><code class="language-cpp">void B::fkt1()
{
  struct CallFkt2
  {
    B* b;

    void operator ()(A&amp; a) const { b-&gt;fkt2(a); };
  };

  CallFkt2 temp;
  temp.b = this;
  std::for_each(vec.begin(), vec.end(), temp);
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611883</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 Nov 2008 16:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 16:47:59 GMT]]></title><description><![CDATA[<p>/edit: hatte was überlesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611899</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 07 Nov 2008 16:47:59 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 16:46:58 GMT]]></title><description><![CDATA[<pre><code>std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun(&amp;B::fkt2), *this));
</code></pre>
<p>Das wäre eigentlich das gewesen, was ich gesucht habe, kompiliert aber leider nicht bei mir.</p>
<p>Muss ich ausser algorithm und functional vielleicht noch irgendwelche Header einbinden?</p>
<p>Ich bekomme leider eine riesen Fehlermeldung (DependencyGraph ist hier meine Klasse B und dgNode ist A).</p>
<pre><code>/usr/include/c++/4.2/bits/stl_function.h: In instantiation of ‘std::binder1st&lt;std::mem_fun1_t&lt;void, DependencyGraph, dgNode&amp;&gt; &gt;’:
/src/DependencyGraph/DependencyGraph.cpp:164:   instantiated from here
/usr/include/c++/4.2/bits/stl_function.h:405: error: forming reference to reference type ‘dgNode&amp;’
/usr/include/c++/4.2/bits/stl_function.h:411: error: forming reference to reference type ‘dgNode&amp;’
/usr/include/c++/4.2/bits/stl_function.h: In function ‘std::binder1st&lt;_Operation&gt; std::bind1st(const _Operation&amp;, const _Tp&amp;) [with _Operation = std::mem_fun1_t&lt;void, DependencyGraph, dgNode&amp;&gt;, _Tp = DependencyGraph]’:
/src/DependencyGraph/DependencyGraph.cpp:164:   instantiated from here
/usr/include/c++/4.2/bits/stl_function.h:421: error: invalid cast from type ‘const DependencyGraph’ to type ‘DependencyGraph*’
/usr/include/c++/4.2/bits/stl_algo.h: In function ‘_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = __gnu_cxx::__normal_iterator&lt;dgNode*, std::vector&lt;dgNode, std::allocator&lt;dgNode&gt; &gt; &gt;, _Function = std::binder1st&lt;std::mem_fun1_t&lt;void, DependencyGraph, dgNode&amp;&gt; &gt;]’:
/src/DependencyGraph/DependencyGraph.cpp:164:   instantiated from here
/usr/include/c++/4.2/bits/stl_algo.h:159: error: no match for call to ‘(std::binder1st&lt;std::mem_fun1_t&lt;void, DependencyGraph, dgNode&amp;&gt; &gt;) (dgNode&amp;)’
</code></pre>
<p>Irgendwie habe ich das Gefühl, dass wenn der Aufruf von for_each derart kompliziert ist, dass eine Schleife vielleicht doch das elegantere Mittel ist. Schade eigentlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611900</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 07 Nov 2008 16:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 18:09:28 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a>,<br />
Ich kenne mich mit dem std::tr1::bind nicht so genau aus, aber ich dachte, es wäre dem von Boost ähnlich bis gleich. Dann fehlt bei deinem Code nämlich noch was, denn mit Boost, geht es so:</p>
<pre><code class="language-cpp">std::for_each(vec.begin(), vec.end(), boost::bind(&amp;B::fkt2, this, _1));
</code></pre>
</blockquote>
<p>Tatsache. War das schon immer so? Dann hatte ich wohl einfach Glück mit meinem Code <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>Jiddoo schrieb:</p>
<blockquote>
<pre><code>std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun(&amp;B::fkt2), *this));
</code></pre>
<p>Das wäre eigentlich das gewesen, was ich gesucht habe, kompiliert aber leider nicht bei mir.</p>
</blockquote>
<p>Probier mal <code>this</code> statt <code>*this</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611921</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 07 Nov 2008 18:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Fri, 07 Nov 2008 20:41:34 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a>,<br />
Ich kenne mich mit dem std::tr1::bind nicht so genau aus, aber ich dachte, es wäre dem von Boost ähnlich bis gleich. Dann fehlt bei deinem Code nämlich noch was, denn mit Boost, geht es so:</p>
<pre><code class="language-cpp">std::for_each(vec.begin(), vec.end(), boost::bind(&amp;B::fkt2, this, _1));
</code></pre>
</blockquote>
<p>Tatsache. War das schon immer so? Dann hatte ich wohl einfach Glück mit meinem Code <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>
</blockquote>
<p>Bei boost::bind schon immer (seit ich es kenne, also min. seit boost version 1.33), ja. bei std::tr1::bind nehme ich an wird es auch so sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1611970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1611970</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 07 Nov 2008 20:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Sat, 08 Nov 2008 11:59:57 GMT]]></title><description><![CDATA[<p>@Jiddoo,</p>
<pre><code class="language-cpp">std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun(&amp;B::fkt2), this));
</code></pre>
<p>Wird leider nicht funktionieren, da <code>B::fkt2</code> ein <code>A&amp;</code> erwartet. Es müsste ein <code>A</code> sein, also keine Referenz. Der C++ Standard ist in diesen Belangen irgendwie äusserst hässlich.<br />
Für sowas ist wirklich Boost.Bind, std::tr1::bind oder das struct zu empfehlen. Oder du machst es einfach &quot;manuell&quot;. Im zukünftigen Standard wird sich dies aber zum Glück ändern.</p>
<p>Übrigens ist Boost auch sonst sehr zu empfehlen. Also falls du es noch nicht hast, ruhig mal anschauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a></p>
<pre><code class="language-cpp">boost::bind(&amp;B::fkt2, this)
</code></pre>
<p>Ist gleich einer Memberfunktion ohne Parameter.</p>
<pre><code class="language-cpp">boost::bind(&amp;B::fkt2, this, _1)
</code></pre>
<p>Sagt, dass es einen Parameter hat.</p>
<pre><code class="language-cpp">boost::bind(&amp;B::fkt2, this, _1, _2)
</code></pre>
<p>Zwei parameter ... usw. <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>War so, seit ich mich erinnern kann.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612003</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 08 Nov 2008 11:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Tue, 11 Nov 2008 09:41:39 GMT]]></title><description><![CDATA[<blockquote>
<p>std::for_each(vec.begin(), vec.end(), boost::bind(&amp;B::fkt2, this, _1));</p>
</blockquote>
<p>Das hat funktioniert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Mit dem tr1 hab ich es nicht hinbekommen, aber vielleicht habe ich da auch noch was in den Compilersettings falsch gehabt.</p>
<p>Boost scheint wirklich unglaublich praktisch zu sein. Wenn ich jetzt noch die Zeit hätte mich da intensiv mit zu beschäftigen... <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>Vielen Dank an alle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613057</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:41:39 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Tue, 11 Nov 2008 10:36:30 GMT]]></title><description><![CDATA[<p>Beim TR1 dürfte ein <code>using std::tr1::placeholders</code> im Funktionsrumpf helfen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613092</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 11 Nov 2008 10:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to for_each für Memberfunktionen? on Tue, 11 Nov 2008 15:08:06 GMT]]></title><description><![CDATA[<p>Jiddoo schrieb:</p>
<blockquote>
<p>Boost scheint wirklich unglaublich praktisch zu sein. Wenn ich jetzt noch die Zeit hätte mich da intensiv mit zu beschäftigen... <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>
</blockquote>
<p>Ja, Boost bietet unheimlich mächtige Mittel. Ich beschäftige mich auch noch nicht so lange mit den Boost C++ Libraries, aber ich bin immer wieder von neuem erstaunt. <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/1613184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613184</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 11 Nov 2008 15:08:06 GMT</pubDate></item></channel></rss>