Klonen von speziellem TreeNode unschön
-
Hi,
ich habe einen kleinen Baum, der folgende Nodes hat:
class TreeNode { public: virtual std::unique_ptr<TreeNode> Clone() const; // ... }; class SpecialTreeNode : public TreeNode { public: virtual std::unique_ptr<TreeNode> Clone() const override; // ... };
Jetzt habe ich aber ein Problem, wenn eine Funktion einen
std::unique_ptr<SpecialTreeNode>
erwartet. Was ich gerne einfach machen würde:void foo(std::unique_ptr<SpecialTreeNode>&& node) {/* ... */} auto node = std::move(CreateSomeSpecialTreeNode()->Clone()); foo(std::move(node));
Normalerweise würde ich hier safe downcasten, geht mit unique_ptr ja aber nicht so einfach. Hier ist ein Post, in dem eine Hilfsfunktion definiert wird, welche den Downcast erlaubt: http://stackoverflow.com/a/21174979/2573127
Trotzdem finde ich das unschön und frage mich, ob hier ein Designfehler vorliegt!?
Vielleicht hat ja jemand dazu eine Intuition.
Viele Grüße
Eisflamme
-
Trotzdem finde ich das unschön und frage mich, ob hier ein Designfehler vorliegt!?
Kovariante Rückgabetypen lassen sich eben leider nicht auf Smart-Pointer ausweiten; Das widerlegt aber die kovariante Natur deiner Funktion doch nicht?
-
Stellt sich ja trotzdem die Frage, ob das idiomatisch suboptimal sein könnte. Deinem Beitrag entnehme ich als Antwort auf diese Frage dann ein "nein"