<?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[Werte verschiedenen Types über call-by-reference tauschen]]></title><description><![CDATA[<p>Hallo Leutz!</p>
<p>Die main:</p>
<pre><code class="language-cpp">int main() {
	int a=1, b=2;
	float x=3, y=4;

	Tauschen(&amp;a, &amp;b);
	Tauschen(&amp;x, &amp;y);

	return 0;
}
</code></pre>
<p>Ich habe eine Funktion zum tauschen zweier Werte über call-by-reference:</p>
<pre><code class="language-cpp">void Tauschen(int *wert1, int *wert2){
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
	int tmp = *wert1;
	*wert1 = *wert2;
	*wert2 = tmp;
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
}
</code></pre>
<p>Aufgerufen wird die Funktion über:</p>
<pre><code class="language-cpp">Tauschen(&amp;a, &amp;b)
</code></pre>
<p>Das klappt ja alles noch wunderbar.</p>
<p>Jetzt soll die Funktion aber so erweitert werden,<br />
dass auch die 2 float-Werte getauscht werden können.</p>
<p>Das funktioniert natürlich nicht (wäre ja zu einfach -.-):</p>
<pre><code class="language-cpp">void Tauschen(float *wert1, float *wert2){
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
	float tmp = *wert1;
	*wert1 = *wert2;
	*wert2 = tmp;
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
}
</code></pre>
<p>Was muss ich nun tun, damit ich int- und float-werte in der Funktion tauschen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286776/werte-verschiedenen-types-über-call-by-reference-tauschen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 18:49:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286776.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 May 2011 12:25:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 12:25:26 GMT]]></title><description><![CDATA[<p>Hallo Leutz!</p>
<p>Die main:</p>
<pre><code class="language-cpp">int main() {
	int a=1, b=2;
	float x=3, y=4;

	Tauschen(&amp;a, &amp;b);
	Tauschen(&amp;x, &amp;y);

	return 0;
}
</code></pre>
<p>Ich habe eine Funktion zum tauschen zweier Werte über call-by-reference:</p>
<pre><code class="language-cpp">void Tauschen(int *wert1, int *wert2){
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
	int tmp = *wert1;
	*wert1 = *wert2;
	*wert2 = tmp;
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
}
</code></pre>
<p>Aufgerufen wird die Funktion über:</p>
<pre><code class="language-cpp">Tauschen(&amp;a, &amp;b)
</code></pre>
<p>Das klappt ja alles noch wunderbar.</p>
<p>Jetzt soll die Funktion aber so erweitert werden,<br />
dass auch die 2 float-Werte getauscht werden können.</p>
<p>Das funktioniert natürlich nicht (wäre ja zu einfach -.-):</p>
<pre><code class="language-cpp">void Tauschen(float *wert1, float *wert2){
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
	float tmp = *wert1;
	*wert1 = *wert2;
	*wert2 = tmp;
	cout &lt;&lt; &quot;a/x=&quot; &lt;&lt; *wert1 &lt;&lt; &quot;| b/y=&quot; &lt;&lt; *wert2 &lt;&lt; endl;
}
</code></pre>
<p>Was muss ich nun tun, damit ich int- und float-werte in der Funktion tauschen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064029</guid><dc:creator><![CDATA[Fishmasta]]></dc:creator><pubDate>Mon, 16 May 2011 12:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 12:36:27 GMT]]></title><description><![CDATA[<p>Fishmasta schrieb:</p>
<blockquote>
<p>Das funktioniert natürlich nicht (wäre ja zu einfach -.-)</p>
</blockquote>
<ol>
<li>&quot;Funktioniert nicht&quot; ist keine gute Fehlermeldung. Siehe Link in meiner Signatur.</li>
<li>Funktionierts doch: <a href="http://ideone.com/Vn13m" rel="nofollow">http://ideone.com/Vn13m</a></li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2064040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064040</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 May 2011 12:36:27 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 12:51:22 GMT]]></title><description><![CDATA[<p>Wieso machst du das ganze nicht mit Referenzen? Ist doch viel einfacher als mit den Zeigern.<br />
Zudem kannst du dir auch ein Template machen, dann kannste das ganze mit allen Datentypen erledigen.</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
void swap( T&amp; lhs, T&amp; rhs )
{
    std::cout &lt;&lt; &quot;lhs = &quot; &lt;&lt; lhs &lt;&lt; &quot; | rhs=&quot; &lt;&lt; rhs &lt;&lt; std::endl;
    T temp = lhs;
    lhs = rhs;
    rhs = temp;
    std::cout &lt;&lt; &quot;lhs = &quot; &lt;&lt; lhs &lt;&lt; &quot; | rhs=&quot; &lt;&lt; rhs &lt;&lt; std::endl;
}
</code></pre>
<p>Lg freeG</p>
<p>EDIT: Wobei es die Funktion auch schon fertig in der STL gibt <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/2064049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064049</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Mon, 16 May 2011 12:51:22 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 12:58:43 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Fishmasta schrieb:</p>
<blockquote>
<p>Das funktioniert natürlich nicht (wäre ja zu einfach -.-)</p>
</blockquote>
<ol>
<li>&quot;Funktioniert nicht&quot; ist keine gute Fehlermeldung. Siehe Link in meiner Signatur.</li>
<li>Funktionierts doch: <a href="http://ideone.com/Vn13m" rel="nofollow">http://ideone.com/Vn13m</a></li>
</ol>
</blockquote>
<p>danach habe ich leider nicht gesucht<br />
die werte welche der funtion übergeben werden sollen schon als int und float und nicht beide als float deklariert sein.</p>
<p>fr33g schrieb:</p>
<blockquote>
<p>Wieso machst du das ganze nicht mit Referenzen? Ist doch viel einfacher als mit den Zeigern.<br />
Zudem kannst du dir auch ein Template machen, dann kannste das ganze mit allen Datentypen erledigen.</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
void swap( T&amp; lhs, T&amp; rhs )
{
    std::cout &lt;&lt; &quot;lhs = &quot; &lt;&lt; lhs &lt;&lt; &quot; | rhs=&quot; &lt;&lt; rhs &lt;&lt; std::endl;
    T temp = lhs;
    lhs = rhs;
    rhs = temp;
    std::cout &lt;&lt; &quot;lhs = &quot; &lt;&lt; lhs &lt;&lt; &quot; | rhs=&quot; &lt;&lt; rhs &lt;&lt; std::endl;
}
</code></pre>
<p>Lg freeG</p>
<p>EDIT: Wobei es die Funktion auch schon fertig in der STL gibt <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>so passts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064055</guid><dc:creator><![CDATA[Fishmasta]]></dc:creator><pubDate>Mon, 16 May 2011 12:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 17:55:08 GMT]]></title><description><![CDATA[<p>Fishmasta schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Fishmasta schrieb:</p>
<blockquote>
<p>Das funktioniert natürlich nicht (wäre ja zu einfach -.-)</p>
</blockquote>
<ol>
<li>&quot;Funktioniert nicht&quot; ist keine gute Fehlermeldung. Siehe Link in meiner Signatur.</li>
<li>Funktionierts doch: <a href="http://ideone.com/Vn13m" rel="nofollow">http://ideone.com/Vn13m</a></li>
</ol>
</blockquote>
<p>danach habe ich leider nicht gesucht<br />
die werte welche der funtion übergeben werden sollen schon als int und float und nicht beide als float deklariert sein.</p>
<p>so passts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Dir ist schon klar, daß dieses Template auch nur gleichartige Variablen austauchen kann <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>Wenn du zwei verschiedene Variablen austauschen willst, mußt du schon eine passende Überladung schreiben - allerdings hast du da das Problem, daß verschiedene Typen nur selten verlustfrei ineinander kopiert werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064234</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 16 May 2011 17:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 19:55:09 GMT]]></title><description><![CDATA[<p>Vielleicht sowas? <a href="http://ideone.com/L1Akc" rel="nofollow">http://ideone.com/L1Akc</a><br />
(Ja, das ist böse, ich weiß.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064314</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 16 May 2011 19:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 21:26:16 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Vielleicht sowas? <a href="http://ideone.com/L1Akc" rel="nofollow">http://ideone.com/L1Akc</a><br />
(Ja, das ist böse, ich weiß.)</p>
</blockquote>
<p>Und wenn du die (unnötigen) <code>static_cast</code> weglässt, dann ist es auch gleich weniger pöse:</p>
<p><a href="http://ideone.com/ntG3D" rel="nofollow">http://ideone.com/ntG3D</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064355</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 May 2011 21:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 22:06:10 GMT]]></title><description><![CDATA[<p>Naja, wenn man (in C++0x) einen explicit operator T() hat, muss man doch nen static_cast verwenden, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2064360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064360</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 16 May 2011 22:06:10 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Mon, 16 May 2011 23:38:31 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Naja, wenn man (in C++0x) einen explicit operator T() hat, muss man doch nen static_cast verwenden, oder?</p>
</blockquote>
<p>Jain.<br />
Man muss einen Context verwenden in dem die Konvertierung &quot;explicit&quot; ist, aber das muss nicht notwendigerweise ein <code>static_cast</code> sein.</p>
<p>Das Problem beim <code>static_cast</code> ist halt, dass er auch ohne mit der Wimper zu zucken einen Downcast macht. Bzw. von <code>void*</code> zu <code>T*</code> konvertiert. Was nicht unbedingt erwünscht ist.</p>
<p>Wobei mir 3 Möglichkeiten einfallen das zu umgehen (und trotzdem explizite Konvertierungen zu erlauben).<br />
<a href="http://ideone.com/3g0yG" rel="nofollow">Beispiel</a>:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;utility&gt;

struct A
{
	explicit A(int a) : a(a) {}
	int a;
};

struct B
{
	explicit B(long b) : b(b) {}

	explicit B(A const&amp; a)
	{
		b = a.a;
	}

	explicit operator A() const
	{
		return A(b);
	}

	long b;
};

struct Base {};
struct Derived : Base {};
struct Unrelated {};

template &lt;class CharType, class Traits&gt;
std::basic_ostream&lt;CharType, Traits&gt;&amp; operator &lt;&lt; (std::basic_ostream&lt;CharType, Traits&gt;&amp; stream, A const&amp; a)
{
	stream &lt;&lt; a.a;
	return stream;
}

template &lt;class CharType, class Traits&gt;
std::basic_ostream&lt;CharType, Traits&gt;&amp; operator &lt;&lt; (std::basic_ostream&lt;CharType, Traits&gt;&amp; stream, B const&amp; b)
{
	stream &lt;&lt; b.b;
	return stream;
}

// -----------------------------------

template &lt;typename T1, typename T2&gt;
void evil_swap(T1&amp; a, T2&amp; b)
{
	T1 tmp = std::move(a);
	a = std::move(static_cast&lt;T1&gt;(b));
	b = std::move(static_cast&lt;T2&gt;(tmp));
}

// -----------------------------------

template &lt;typename T1, typename T2&gt;
void less_evil_swap_0(T1&amp; a, T2&amp; b)
{
	T2 aAsT2(std::move(a));
	T1 bAsT1(std::move(b));

	a = std::move(bAsT1);
	b = std::move(aAsT2);
}

// -----------------------------------

template &lt;typename D, typename S&gt;
D less_evil_cast_1(S&amp;&amp; s)
{
	D d(s); // NOTE: *not* return D(s), since this would allow conversion of non-related pointers and the like! (see below)
	return d;
}

template &lt;typename D, typename S&gt;
D utterly_evil_cast(S&amp;&amp; s)
{
	return D(s); // baaaaaad!
}

template &lt;typename T1, typename T2&gt;
void less_evil_swap_1(T1&amp; a, T2&amp; b)
{
	T2 aAsT2(std::move(a));
	a = less_evil_cast_1&lt;T1&gt;(std::move(b));
	b = std::move(aAsT2);
}

template &lt;typename T1, typename T2&gt;
void utterly_evil_swap(T1&amp; a, T2&amp; b)
{
	T1 tmp(std::move(a));
	a = utterly_evil_cast&lt;T1&gt;(std::move(b));
	b = utterly_evil_cast&lt;T2&gt;(std::move(tmp));
}

// -----------------------------------

template &lt;typename D, typename S&gt;
D less_evil_cast_2(S&amp;&amp; s)
{
	return static_cast&lt;D&gt;(s);
}

template &lt;typename D, typename S&gt;
D less_evil_cast_2(S*&amp;&amp; s)
{
	return s; // don't allow down-casts
}

template &lt;typename T1, typename T2&gt;
void less_evil_swap_2(T1&amp; a, T2&amp; b)
{
	T2 aAsT2(std::move(a));
	a = less_evil_cast_2&lt;T1&gt;(std::move(b));
	b = std::move(aAsT2);
}

int main()
{
	A a(42);
	B b(6);

	std::cout &lt;&lt; a &lt;&lt; &quot;, &quot; &lt;&lt; b &lt;&lt; std::endl;

	less_evil_swap_0(a, b);

	std::cout &lt;&lt; a &lt;&lt; &quot;, &quot; &lt;&lt; b &lt;&lt; std::endl;

	less_evil_swap_1(a, b);

	std::cout &lt;&lt; a &lt;&lt; &quot;, &quot; &lt;&lt; b &lt;&lt; std::endl;

	less_evil_swap_2(a, b);

	std::cout &lt;&lt; a &lt;&lt; &quot;, &quot; &lt;&lt; b &lt;&lt; std::endl;

	// ...

	Base* b1 = 0;
	Base* b2 = 0;
	Derived* d = 0;
	Unrelated* u = 0;
	void* v = 0;

	less_evil_swap_0(b1, b2);
	less_evil_swap_1(b1, b2);
	less_evil_swap_2(b1, b2);

	//less_evil_swap_0(b1, d); // doesn't compile, good
	//less_evil_swap_1(b1, d); // doesn't compile, good
	//less_evil_swap_2(b1, d); // doesn't compile, good

	//less_evil_swap_0(b1, v); // doesn't compile, good
	//less_evil_swap_1(b1, v); // doesn't compile, good
	//less_evil_swap_2(b1, v); // doesn't compile, good

	//less_evil_swap_0(b1, u); // doesn't compile, good
	//less_evil_swap_1(b1, u); // doesn't compile, good
	//less_evil_swap_2(b1, u); // doesn't compile, good

	evil_swap(b1, d); // compiles, but not desirable, shit!
	evil_swap(b1, v); // compiles, but not desirable, shit!
	//evil_swap(b1, u); // doesn't compile, good

	utterly_evil_swap(b1, d); // compiles, but not desirable, shit!
	utterly_evil_swap(b1, v); // compiles, but not desirable, shit!
	utterly_evil_swap(b1, u); // compiles, but not desirable, shit!

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2064368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064368</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 May 2011 23:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Werte verschiedenen Types über call-by-reference tauschen on Tue, 17 May 2011 13:26:11 GMT]]></title><description><![CDATA[<p>Danke für den Code, jetzt hab ichs verstanden, warum meine Variante schlecht ist. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2064670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2064670</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 17 May 2011 13:26:11 GMT</pubDate></item></channel></rss>