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


  • Mod

    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" 🙂


Anmelden zum Antworten