Was ist der richtige Weg, um meine swap
in STL-Algorithmen zu aktivieren ?
1) Mitglied swap
. Does std::swap
verwendete SFINAE Trick , um das Element zu verwenden swap
.
2) Freistehend swap
im gleichen Namespace.
3) Teilspezialisierung von std::swap
.
4) Alle oben genannten.
Danke dir.
EDIT: Sieht so aus, als hätte ich meine Frage nicht klar formuliert. Grundsätzlich habe ich eine Vorlagenklasse und ich benötige STL-Algen, um die (effiziente) Swap-Methode zu verwenden, die ich für diese Klasse geschrieben habe.
using std::swap;
aktiviert ADL nicht, sondern ermöglicht dem Compiler nur zu ermitteln,std::swap
ob ADL keine ordnungsgemäße Überladung findet.Um die EDIT zu beantworten, bei der es sich bei den Klassen möglicherweise um Vorlagenklassen handelt, benötigen Sie überhaupt keine Spezialisierung. Betrachten Sie eine Klasse wie diese:
Sie können Klassen definieren wie:
Wenn Sie in der Lage sein möchten, eine Funktion zum Implementieren aller drei Swaps zu erstellen (nicht, dass diese Beispielklasse dies rechtfertigt), tun Sie genau wie in (2) Xeo gesagt ... ohne Spezialisierung, sondern erstellen einfach eine reguläre Vorlagenfunktion:
Die Swap-Vorlagenfunktion sollte sich im selben Namespace befinden wie die Klasse, die Sie austauschen möchten. Die folgende Methode findet und verwendet diesen Swap, obwohl Sie diesen Namespace nicht mit ADL referenzieren:
quelle
Es scheint, dass (2) ( freistehend
swap
im selben Namespace, in dem die benutzerdefinierte Klasse deklariert ist ) die einzige zulässige Möglichkeit ist,swap
eine benutzerdefinierte Klasse bereitzustellen , da das Hinzufügen von Deklarationen zum Namespacestd
im Allgemeinen ein undefiniertes Verhalten ist. Erweitern des Namespace std (cppreference.com) :Und
swap
wird nicht als eine dieser Ausnahmen bezeichnet. Das Hinzufügen einer eigenenswap
Überladung zumstd
Namespace ist daher ein undefiniertes Verhalten.Es wird auch gesagt, dass die Standardbibliothek einen unqualifizierten Aufruf der
swap
Funktion verwendet, um benutzerdefinierte Aufrufeswap
für eine Benutzerklasse aufzurufen, wenn diese benutzerdefiniertswap
bereitgestellt werden.Austauschbar (cppreference.com) :
Swap (www.cplusplus.com) :
Beachten Sie jedoch, dass die direkte Verwendung der
std::swap
Funktion für eine benutzerdefinierte Klasse die generische Version vonstd::swap
anstelle der benutzerdefinierten aufruftswap
:Es wird daher empfohlen, die
swap
Funktion im Benutzercode auf dieselbe Weise aufzurufen wie in der Standardbibliothek:quelle