Gibt es eine elegante Möglichkeit, Referenzen in C ++ auszutauschen?
Manchmal verweisen Klassen auf andere Klassen. Implementierung vonstd::swap()
für solche Klassen kann nicht einfach sein, da dies zum Austauschen von Originalinstanzen anstelle von Referenzen führen würde. Der folgende Code veranschaulicht dieses Verhalten:
#include <iostream>
class A
{
int& r_;
public:
A(int& v) : r_(v) {}
void swap(A& a)
{
std::swap(r_, a.r_);
}
};
void test()
{
int x = 10;
int y = 20;
A a(x), b(y);
a.swap(b);
std::cout << "x=" << x << "\n"
<< "y=" << y << "\n";
}
int main()
{
test();
return 0;
}
Eine einfache Problemumgehung mit einer Gewerkschaft:
class A
{
union
{
int& r_;
size_t t_;
};
public:
A(int& v) : r_(v) {}
void swap(A& a)
{
std::swap(t_, a.t_);
}
};
Dies ist effektiv, aber nicht gut aussehend. Gibt es eine schönere Möglichkeit, zwei Referenzen in C ++ auszutauschen? Wie erklärt der C ++ - Standard das Mischen von Referenzen und Werten in einer Union, wenn man bedenkt, dass in Stroustrup's "Die C ++ - Programmiersprache" Buche ein'Referenz' ist definiert als ein 'alternativer Name eines Objekts, ein Alias' (S.189).