<?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[Listener für std::list::push_back]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte einen Listener auf std::list::push_back haben.</p>
<p>Mein erster Gedanke (sorry, ich bin seit ner geraumer Zeit in java unterwegs) wär von std::list zu erben, push_back zu überschreiben ...</p>
<p>Nur sollte man von std::list nicht erben und push_back ist ja auch nicht virtual.</p>
<p>Trotzdem möchte ich<br />
- einen container mit listener<br />
- diesen container als drop-in replacement für std::list. Also z.B. für den Aufruf der Funktion void addStuff( std::list&lt;int&gt;&amp; list) verwenden können.</p>
<p>Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327172/listener-für-std-list-push_back</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 00:31:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327172.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Jul 2014 23:35:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Listener für std::list::push_back on Sat, 26 Jul 2014 23:35:33 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte einen Listener auf std::list::push_back haben.</p>
<p>Mein erster Gedanke (sorry, ich bin seit ner geraumer Zeit in java unterwegs) wär von std::list zu erben, push_back zu überschreiben ...</p>
<p>Nur sollte man von std::list nicht erben und push_back ist ja auch nicht virtual.</p>
<p>Trotzdem möchte ich<br />
- einen container mit listener<br />
- diesen container als drop-in replacement für std::list. Also z.B. für den Aufruf der Funktion void addStuff( std::list&lt;int&gt;&amp; list) verwenden können.</p>
<p>Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410637</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Sat, 26 Jul 2014 23:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 00:49:56 GMT]]></title><description><![CDATA[<p>Nö. Warum baust Du nicht an addStuff was ran?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410639</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 27 Jul 2014 00:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 01:05:15 GMT]]></title><description><![CDATA[<p>naja, weil addStuff einfach da ist und nicht verändert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410641</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Sun, 27 Jul 2014 01:05:15 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 01:18:43 GMT]]></title><description><![CDATA[<p>Dann würde ich sagen hast du ein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410642</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 27 Jul 2014 01:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 01:31:20 GMT]]></title><description><![CDATA[<p>was müsste denn die signatur von addStuff sein, damit jeder std-like container verwendet werden kann?</p>
<p>Wenn ich nicht gleich</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
addStuff(T&amp; container)
</code></pre>
<p>haben will? Gibts da ein trait oder sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410643</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Sun, 27 Jul 2014 01:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 01:40:19 GMT]]></title><description><![CDATA[<p>kartoffelsack schrieb:</p>
<blockquote>
<p>Gibts da ein trait oder sowas?</p>
</blockquote>
<p>Kurz gesagt, nimm wieder Java.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410644</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 27 Jul 2014 01:40:19 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 07:39:29 GMT]]></title><description><![CDATA[<blockquote>
<p>haben will? Gibts da ein trait oder sowas?</p>
</blockquote>
<p>Naja, was klassifiziert einen STL-Container? Ich denke du meinst sequentielle; diese haben alle ein Memberfunktionstemplate namens <code>emplace_back</code> . Mit der Annahme dass die Elemente default-constructible sind:</p>
<pre><code>template &lt;typename T&gt;
using void_t = void;

#define CHECK_EXPR(...) void_t&lt;decltype(__VA_ARGS__)&gt;

template &lt;typename T&gt;
auto addStuff(T&amp; t) -&gt; CHECK_EXPR(t.emplace_back()) {} // Falls die Elemente nicht default-constructible sind, den Bedingungs-Ausdruck ändern.

#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;set&gt;

int main()
{
	std::vector&lt;int&gt; v;
	std::list&lt;int&gt; l;
	addStuff(v);
	addStuff(l);
	std::set&lt;int&gt; s;
	addStuff(s); // Fehler
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2410650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410650</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 27 Jul 2014 07:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 09:24:16 GMT]]></title><description><![CDATA[<p>Wozu überhaupt std::list? Willst du dein Programm künstlich langsam machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410663</guid><dc:creator><![CDATA[überlisted]]></dc:creator><pubDate>Sun, 27 Jul 2014 09:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 09:48:30 GMT]]></title><description><![CDATA[<p>Kommt wahrscheinlich daher, dass das List-Interface in Java für alle sequentiellen Collections verwendet wird. In C++ verwendet man aber std::vector, ausser man hat gute Gründe dagegen.</p>
<p>kartoffelsack, in C++ sind viele Paradigmen grundsätzlich verschieden von Java. Zum Beispiel ist der normale Weg, um Funktionalität zu erweitern, eben <strong>nicht</strong> Vererbung und Methoden-Überschreibung. Du hast halt auch viele Abstraktionsmittel, die dir in Java fehlen (freie Funktionen, Templates, Typedef, Namensräume und ADL).</p>
<p>Die STL ist komplett anders entworfen als Java Collections, entsprechend musst du anders damit arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410666</guid><dc:creator><![CDATA[hinterlist]]></dc:creator><pubDate>Sun, 27 Jul 2014 09:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 10:27:21 GMT]]></title><description><![CDATA[<p>@überlisted: addStuff könnte ja auch in der Mitte was hinzufügen. Deswegen list.</p>
<p>Egal.</p>
<p>Angenommen ich will einen container schreiben, der das registrieren von listeners für push_back etc. erlaubt. Ansonsten soll sich der container wie ein std container verhalten. Wich mach ich das am besten?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class ObservableContainer
:private T //has-a
{
public:
  //alles was ich nicht ändern will per using verfügbar machen
  using T::size;
  //...
  //gibts es auch was einfacheres als jedes einzelne element von T explizit 
  //mit &quot;using&quot; zu spezifizieren? Speziell hätte ich gern alle members automatisch da.

  //alles was ich ändern will, neu implementieren ...

  auto push_back(T::value_type item) -&gt; decltype(T::push_back(item))  //ich weiß die Zeile stimmt nicht ganz. Darum gehts mir aber grad nicht.
  {

     T::push_back(item);
     //call observer
  }
};
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2410671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410671</guid><dc:creator><![CDATA[kartoffelsack_logged_out]]></dc:creator><pubDate>Sun, 27 Jul 2014 10:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 10:32:03 GMT]]></title><description><![CDATA[<p>Davon abgesehen gibt es auch keinen ernsthaften Grund, warum man einen Container ueberschreiben soll, schliesslich ist ein Container nur zum Aufbewahren da. Fuer Extra-Funktionalitaet ist die Klasse zustaendig, die den Container enthaelt und nach aussen hin kapselt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410672</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Sun, 27 Jul 2014 10:32:03 GMT</pubDate></item><item><title><![CDATA[Reply to Listener für std::list::push_back on Sun, 27 Jul 2014 10:37:26 GMT]]></title><description><![CDATA[<p>Du denkst immer noch zu stark in Java-Mustern. Nur weil du bei push_back() einen Listener aufrufen willst, musst du nicht gleich eine neue Klasse schreiben, welche die komplette Schnittstelle dupliziert.</p>
<p>Entweder du schreibst dir eine freie Funktion, welche push_back() und den Listener aufruft. Vielleicht auch eine Mikro-Klasse, wenn du State für den Listener brauchst.</p>
<p>Oder du kapselst gleich richtig, schreibst eine neue Klasse, aber bietest nur wenige Operationen an. Das musst du ohnehin, wenn du Invarianten erhalten willst; sonst könnte man mit insert(), resize(), emplace() und all den anderen Einfügefunktionen einfach an deinem Listener vorbeiprogrammieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410673</guid><dc:creator><![CDATA[hinterlist]]></dc:creator><pubDate>Sun, 27 Jul 2014 10:37:26 GMT</pubDate></item></channel></rss>