Sollten alle / die meisten Setter-Funktionen in C ++ 11 als Funktionsvorlagen geschrieben werden, die universelle Referenzen akzeptieren?
Betrachten Sie eine KlasseX
mitN
Mitgliedsvariablen, jede von einigenkopierbar undbeweglich Typ undN
entsprechende Einstellfunktionen. In C ++ 98 ist die Definition vonX
würde wahrscheinlich so aussehen:
class X
{
public:
void set_a(A const& a) { _a = a; }
void set_b(B const& b) { _b = b; }
...
private:
A _a;
B _b;
...
};
Setterfunktionen der KlasseX
oben kann sowohl an lvalue- als auch an rvalue-Argumente gebunden werden. Abhängig vom eigentlichen Argument ist dieskönnte Ergebnis in der Schaffung eines temporären undwerden führen schließlich zu einer Kopieraufgabe; deswegen,nicht kopierbar Typen werden von diesem Entwurf nicht unterstützt.
Mit C ++ 11 verfügen wir über Verschiebungssemantik, perfekte Weiterleitung und universelle Referenzen (Scott Meyers Terminologie), die eine effizientere und allgemeinere Verwendung von Setter-Funktionen ermöglichen, indem sie folgendermaßen umgeschrieben werden:
class X
{
public:
template<typename T>
void set_a(T&& a) { _a = std::forward<T>(a); }
template<typename T>
void set_b(T&& b) { _b = std::forward<T>(b); }
...
private:
A _a;
B _b;
...
};
Universelle Referenzen können an bindenconst
/nicht-const
, volatile
/nicht-volatile
und generell für alle konvertierbaren Typen, bei denen die Erstellung von temporären Werten vermieden und Werte direkt an übergeben werdenoperator =
. Nicht kopierbar, beweglich Typen werden jetzt unterstützt. Eventuell unerwünschte Bindungen können entweder durch beseitigt werdenstatic_assert
oder durchstd::enable_if
.
Meine Frage lautet also: alsKonstruktionsrichtlinieSollen alle (sagen wir, die meisten) Setter-Funktionen in C ++ 11 als Funktionsvorlagen geschrieben werden, die universelle Referenzen akzeptieren?
Abgesehen von der umständlicheren Syntax und der Unmöglichkeit, Intellisense-ähnliche Hilfsprogramme beim Schreiben von Code in diesen Setterfunktionen zu verwenden, gibt es beim hypothetischen Prinzip relevante Nachteile. "Write-Setter-Funktionen als Funktionsschablonen, die nach Möglichkeit universelle Referenzen akzeptieren"?