<?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[swap fuer eigene Klasse definieren]]></title><description><![CDATA[<p>Hallo Leute.</p>
<p>Wie ist eigentlich die bevorzugte Methode swap fuer einen UDT anzubieten? 3 Fragen dazu:</p>
<ol>
<li></li>
</ol>
<p>Hat der TR1 folgendes erlaubt:</p>
<pre><code class="language-cpp">namespace std {
  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }
}
</code></pre>
<p>Oder ist es immernoch offiziell verboten?</p>
<ol start="2">
<li></li>
</ol>
<p>Was verwendet man nun um swap anzubieten?<br />
Ueberladung im namespace std?</p>
<pre><code class="language-cpp">namespace std {
  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }
}
</code></pre>
<p>oder Definition im namespace der Klasse</p>
<pre><code class="language-cpp">namespace myns {
  class MyClass;

  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }  
}
</code></pre>
<p>?</p>
<ol start="3">
<li></li>
</ol>
<p>Und das interessanteste zum Schluss:<br />
wie ist die bevorzugte Methode ein swap auf einen UDT zu machen den man nicht kennt?<br />
std::swap aufrufen?</p>
<pre><code class="language-cpp">template&lt;typename T, typename F&gt;
void copy_apply_swap(T&amp; o, F f) {
  T t(o);
  f(t);
  std::swap(t, o);
}
</code></pre>
<p>Hier wuerde man ja ADL umgehen und swap nicht finden wenn es im namespace der Klasse definiert wurde.</p>
<pre><code class="language-cpp">template&lt;typename T, typename F&gt;
void copy_apply_swap(T&amp; o, F f) {
  T t(o);
  f(t);
  using std::swap;
  swap(t, o);
}
</code></pre>
<p>Das sieht haesslich aus, aber dafuer muesste ADL ja wirken und wir das swap immer finden...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212914/swap-fuer-eigene-klasse-definieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 14:15:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212914.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 May 2008 10:45:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 10:45:50 GMT]]></title><description><![CDATA[<p>Hallo Leute.</p>
<p>Wie ist eigentlich die bevorzugte Methode swap fuer einen UDT anzubieten? 3 Fragen dazu:</p>
<ol>
<li></li>
</ol>
<p>Hat der TR1 folgendes erlaubt:</p>
<pre><code class="language-cpp">namespace std {
  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }
}
</code></pre>
<p>Oder ist es immernoch offiziell verboten?</p>
<ol start="2">
<li></li>
</ol>
<p>Was verwendet man nun um swap anzubieten?<br />
Ueberladung im namespace std?</p>
<pre><code class="language-cpp">namespace std {
  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }
}
</code></pre>
<p>oder Definition im namespace der Klasse</p>
<pre><code class="language-cpp">namespace myns {
  class MyClass;

  template&lt;typename T&gt;
  void swap(MyClass&lt;T&gt;&amp; a, MyClass&lt;T&gt;&amp; b) {
    a.swap(b);
  }  
}
</code></pre>
<p>?</p>
<ol start="3">
<li></li>
</ol>
<p>Und das interessanteste zum Schluss:<br />
wie ist die bevorzugte Methode ein swap auf einen UDT zu machen den man nicht kennt?<br />
std::swap aufrufen?</p>
<pre><code class="language-cpp">template&lt;typename T, typename F&gt;
void copy_apply_swap(T&amp; o, F f) {
  T t(o);
  f(t);
  std::swap(t, o);
}
</code></pre>
<p>Hier wuerde man ja ADL umgehen und swap nicht finden wenn es im namespace der Klasse definiert wurde.</p>
<pre><code class="language-cpp">template&lt;typename T, typename F&gt;
void copy_apply_swap(T&amp; o, F f) {
  T t(o);
  f(t);
  using std::swap;
  swap(t, o);
}
</code></pre>
<p>Das sieht haesslich aus, aber dafuer muesste ADL ja wirken und wir das swap immer finden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507379</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 12 May 2008 10:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 11:34:38 GMT]]></title><description><![CDATA[<ol>
<li>Ja, immer noch verboten<br />
Folglich</li>
<li>die 2. Alternative (wobei friend+Definition in der Klasse bequemer sein dürfte)</li>
<li>es bleibt nur die 2. Variante übrig.<br />
Die kein-using-in-Headern Regel ist hier nicht anzuwenden und die typischen Gefahren des using bestehen hier im Grunde auch nicht (wenn wir annehmen, dass die Programmierer wenigstens soweit bei Verstand waren und nicht den sinnvoll vorbelegten Namen swap für etwas völlig anderes missbraucht haben).</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1507389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507389</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 May 2008 11:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 11:39:20 GMT]]></title><description><![CDATA[<p>is ja daemlich <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=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507408</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 12 May 2008 11:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 11:48:46 GMT]]></title><description><![CDATA[<p>Swap ist doch ein Dreizeiler. Wozu der Aufwand? Und brauchen tut man es auch extrem selten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507414</guid><dc:creator><![CDATA[ääää???]]></dc:creator><pubDate>Mon, 12 May 2008 11:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 12:09:48 GMT]]></title><description><![CDATA[<p>ääää??? schrieb:</p>
<blockquote>
<p>Swap ist doch ein Dreizeiler. Wozu der Aufwand? Und brauchen tut man es auch extrem selten.</p>
</blockquote>
<p>Tja, swap ist eben nicht ein dreizeiler <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="😉"
    /><br />
swap ist eine der essentiellsten Funktionen die eine Klasse in C++ bieten muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507431</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 12 May 2008 12:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 12:23:31 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>ääää??? schrieb:</p>
<blockquote>
<p>Swap ist doch ein Dreizeiler. Wozu der Aufwand? Und brauchen tut man es auch extrem selten.</p>
</blockquote>
<p>Tja, swap ist eben nicht ein dreizeiler <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>Wann nicht?</p>
<blockquote>
<p>swap ist eine der essentiellsten Funktionen die eine Klasse in C++ bieten muss.</p>
</blockquote>
<p>Wozu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507444</guid><dc:creator><![CDATA[ääää???]]></dc:creator><pubDate>Mon, 12 May 2008 12:23:31 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 12:54:50 GMT]]></title><description><![CDATA[<p>ääää??? schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>ääää??? schrieb:</p>
<blockquote>
<p>Swap ist doch ein Dreizeiler. Wozu der Aufwand? Und brauchen tut man es auch extrem selten.</p>
</blockquote>
<p>Tja, swap ist eben nicht ein dreizeiler <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>Wann nicht?</p>
</blockquote>
<p>Weil es keinen logischen Grund gibt, weshalb swap fehlschlagen können sollte. Ein simpler Dreieckstausch dagegen kann ggf. beim Kopieren fehlschlagen - weil unser Objekt irgendwelche Resourcen hält, die erschöpft sind. Zudem kann swap für Klassen sinnvoll sein, die an sich nicht kopierbar sind.</p>
<p>ääää??? schrieb:</p>
<blockquote>
<blockquote>
<p>swap ist eine der essentiellsten Funktionen die eine Klasse in C++ bieten muss.</p>
</blockquote>
<p>Wozu?</p>
</blockquote>
<p>Weil es ein fundamentaler Baustein ist, um exceptionsicheren Code zu schreiben - sofern swap eben selbst keine Exceptions auslösen kann.</p>
<p>Kleine Anmerkung: Die Bedeutung von swap dürft im neuen Standard zurückgehen, weil es heute häufig gebraucht wird, wenn eigentlich ein move angebracht wäre. Zudem ist ein Dreieckstausch per move statt copy unter den gleichen Randbedingungen unproblematisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507472</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 May 2008 12:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 13:04:25 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ein simpler Dreieckstausch dagegen kann ggf. beim Kopieren fehlschlagen - weil unser Objekt irgendwelche Resourcen hält, die erschöpft sind.</p>
</blockquote>
<p>Jetzt wird es interessant. Wie tauscht du den etwas ohne eine Kopie zu machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507475</guid><dc:creator><![CDATA[ääää???]]></dc:creator><pubDate>Mon, 12 May 2008 13:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 13:31:51 GMT]]></title><description><![CDATA[<p>ääää??? schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ein simpler Dreieckstausch dagegen kann ggf. beim Kopieren fehlschlagen - weil unser Objekt irgendwelche Resourcen hält, die erschöpft sind.</p>
</blockquote>
<p>Jetzt wird es interessant. Wie tauscht du den etwas ohne eine Kopie zu machen?</p>
</blockquote>
<p>z.B. Zwei Listen, hier genügt es die internen Zeiger zu vertauschen (und geringfügig andere Member wie die Größe). Bei einem Dreickstausch würden zuerst alle Elemente einer Liste in eine temporäre Liste kopiert, dann die Elemente der zweiten Liste in die Erste, dann die Elemente der temporären Liste in die zweite Liste. Der Performanceunterschied sollte erheblich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507482</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Mon, 12 May 2008 13:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 13:38:40 GMT]]></title><description><![CDATA[<p>Don06 schrieb:</p>
<blockquote>
<p>z.B. Zwei Listen, hier genügt es die internen Zeiger zu vertauschen (und geringfügig andere Member wie die Größe). Bei einem Dreickstausch würden zuerst alle Elemente einer Liste in eine temporäre Liste kopiert, dann die Elemente der zweiten Liste in die Erste, dann die Elemente der temporären Liste in die zweite Liste. Der Performanceunterschied sollte erheblich sein.</p>
</blockquote>
<p>viel interessanter als die performance ist aber die garantie dass ein swap nicht fehlschlagen kann.</p>
<p>copy&amp;swap ermoeglicht es transaktionen zu implementieren. man erstellt erst ein temporaeres objekt das alle eigenschaften hat die man haben will und erst wenn das alles erfolgreich war, dann nimmt man das originale objekt und macht ein swap.</p>
<p>die move semantik mit c++0x wird das ersetzen, da man dann kein swap macht, sondern ein move des temporaeren objektes in das originale macht.</p>
<p>ohne so eine swap oder move semantik sind sachen wie transaktionen oder funktionen nachd er strong exception guarantee nicht moeglich.</p>
<p>dass die performance enorm nett ist, ist ein nebeneffekt den man gerne mit nimmt, aber es ist nicht der hauptgrund warum swap so essentiell ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507484</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 12 May 2008 13:38:40 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 14:05:09 GMT]]></title><description><![CDATA[<p>Don06 schrieb:</p>
<blockquote>
<p>ääää??? schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Ein simpler Dreieckstausch dagegen kann ggf. beim Kopieren fehlschlagen - weil unser Objekt irgendwelche Resourcen hält, die erschöpft sind.</p>
</blockquote>
<p>Jetzt wird es interessant. Wie tauscht du den etwas ohne eine Kopie zu machen?</p>
</blockquote>
<p>z.B. Zwei Listen, hier genügt es die internen Zeiger zu vertauschen (und geringfügig andere Member wie die Größe). Bei einem Dreickstausch würden zuerst alle Elemente einer Liste in eine temporäre Liste kopiert, dann die Elemente der zweiten Liste in die Erste, dann die Elemente der temporären Liste in die zweite Liste. Der Performanceunterschied sollte erheblich sein.</p>
</blockquote>
<p>OK, sollte was bringen, aber die Zeiger musst du trotzdem mit nem Dreickstausch tauschen.</p>
<p>Aber wann braucht ihr den swap so oft? Beim sortieren braucht mans, was aber ja schon meistens fertig implementiertist. Ich kann mich an kaum was errinnern wo ich ein swap gebraucht hab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507498</guid><dc:creator><![CDATA[ääää???]]></dc:creator><pubDate>Mon, 12 May 2008 14:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 14:20:47 GMT]]></title><description><![CDATA[<p>ääää??? schrieb:</p>
<blockquote>
<p>OK, sollte was bringen, aber die Zeiger musst du trotzdem mit nem Dreickstausch tauschen.</p>
</blockquote>
<p>aber zeiger tauschen kostet nix und kann nicht fehlschlagen.</p>
<blockquote>
<p>Aber wann braucht ihr den swap so oft? Beim sortieren braucht mans, was aber ja schon meistens fertig implementiertist. Ich kann mich an kaum was errinnern wo ich ein swap gebraucht hab.</p>
</blockquote>
<p>zB um einen op= zu implementieren:</p>
<pre><code class="language-cpp">Class&amp; operator=(Class const&amp; other) {
  Class temp(other);
  swap(*this, temp);
  return *this;
}
</code></pre>
<p>Es gibt enorm viele situationen wo man swapen (oder besser gesagt moven) will. immer dann wenn eine operation fehlschlagen kann ist ein swap/move gold wert.</p>
<p>mit copy&amp;swap hat man eben transaktionen. das swap ist hier das commit.<br />
und wenn ich ein rollback will, mache ich das swap einfach nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1507509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507509</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 12 May 2008 14:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to swap fuer eigene Klasse definieren on Mon, 12 May 2008 16:23:58 GMT]]></title><description><![CDATA[<p>ääää??? schrieb:</p>
<blockquote>
<p>OK, sollte was bringen, aber die Zeiger musst du trotzdem mit nem Dreickstausch tauschen.</p>
</blockquote>
<p>Schon, aber das war gar nicht Gegenstand meiner Betrachtungen. Getauscht werden soll das <em>ganze</em> Objekt, und dies geschieht nicht durch Dreieckstausch (also Kopieren+2*Zuweisen des <em>ganzen</em> Objektes).</p>
<p>Kleines Beispiel, wo std::swap sogar mal fehlschlägt und eine eigene Version zwingend erforderlich für diese Funtionalität ist:</p>
<pre><code class="language-cpp">class Container
{
    class Proxy { ... };
    Proxy operator[](..);
};

void f()
{
    Container foo( ... );
    std::swap(foo[0],foo[1]); // tut praktisch das Falsche - und ist formal undefiniert, da Kopieren und Zuweisen bei Proxies fundamental voneinander abweichen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1507565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1507565</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 May 2008 16:23:58 GMT</pubDate></item></channel></rss>