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-volatileund 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"?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage