Ich implementiere ein Decorator-Muster auf unveränderlichen Objekten mit dem Pointer-zu-Implementierungs-Idiom. Im Grunde genommen mein Setup sieht wie folgt ausIst es möglich, zu erkennen, ob das Objekt innerhalb der Elementfunktion temporär ist?
struct Object : ObjectBase {
void doSmth() override {
impl->doSmth();
}
// this is the function I'd like to implement
Object decorateWith(std::unique_ptr<ObjectDecorator>&&);
private:
std::unique_ptr<ObjectBase> impl;
};
struct ObjectDecorator : ObjectBase {
void doSmth() override {
// do some stuff
impl->doSmth();
// do some more stuff
}
private:
std::unique_ptr<ObjectBase> impl;
};
Hier wird die decorateWith Funktion soll ein anderes Verhalten haben, je nachdem, ob das Objekt wird callen auf eine temporäre oder nicht. Wenn es für ein nicht-temporäres Objekt aufgerufen wird, soll es eine neue Objektinstanz zurückgeben, wo ich eine tiefe Kopie des aktuellen Objekts erstellen und es in dem unique_ptr des Dekorators während des Impl-Zeigers des neuen Objekts selbst speichern muss zeigt auf den Dekorateur. Wenn jedoch decorateWith für eine temporäre aufgerufen wird, genügt es, einen ObjectDecorator zu erstellen und den impl-Zeiger des aktuellen Objekts einfach in den impl-Zeiger des Dekorators zu bewegen und das Objekt auf den neuen Decorator zu zeigen.
Um zu erreichen, dass ich eine Möglichkeit, aus dem Aufruf von decorateWith zu ermitteln, ob das Objekt ein temporäres oder nicht ist, und verwenden Sie dann Tag-Dispatch basierend auf das Ergebnis dieser Prüfung. Ist das möglich?
Beste Xodion
EDIT: Beispiel Anrufer Code könnte wie folgt aussehen:
decorateWith auf einer nicht nur vorübergehenden genannt wird
int main() { Object x{}; // this call does not modify x so it can be reused later Object y = x.decorateWith{std::make_unique<ObjectDecorator>()}; y.doSmth(); // do some other stuff here // here, if I had moved the impl-unique_ptr in the decorateWith // call this would now segfault since I'd call nullptr->doSmth(); x.doSmth(); }
decorateWith auf Zeit genannt wird,
int main() { Object x = Object{}.decorateWith(std::make_unique<ObjectDecorator>()) .decorateWith(std::make_unique<ObjectDecorator>()) .decorateWith(std::make_unique<ObjectDecorator>()); // in this case it would be unneccessary to make a deep copy of all // previous instances so I'd like to only move the impl poiner every time x.doSmth() }
Ihre Erklärung könnte besser mit Beispielaufrufcode gesichert werden. – kfsone
Fragen Sie, ob das 'Objekt' 'decorateWith' aufgerufen wird von ist temporär, oder ob das Argument zu' decorateWith' temporär ist? – md5i
Ich möchte mich nur bedingt bewegen, wenn das Objekt, auf dem decorateWith aufgerufen wird, ein temporäres Objekt ist und ansonsten eine tiefe Kopie erstellt. Es geht also darum, zu prüfen, ob ein Objekt temporär ist. Wie die untenstehenden Antworten zeigen, ist keine Art von Typeigenschaft erforderlich, da man ref-Qualifikatoren überladen kann. – Corristo