• [^] # Re: Donc pour résumer...

    Posté par . En réponse à la dépêche C++17, Genèse d’une version mineure. Évalué à 2.

    L’usage d’une fonction clone est problématique aussi (qu’est censé faire Derived::clone(Base const& b) si on lui donne un Base& qui est de type Derived2 ? Un assert ? pas terrible...).

    Je n'utiliserais pas la même signature moi, je ferai plutôt static bool Derived::clone( Base const& b, Derived& a ); du coup, tu fais ce que tu veux quand ça échoue, avec a qui n'est pas modifié si tu as fais les choses bien.

    Personnellement, j'opte de plus en plus souvent pour l'usage de constructeurs nommés (static foo::make( ... );) et quand ça rate (paramètre foireux, initialisation impossible, whatever), selon mon API je throw ou retourne foo().
    C'est un idiome plutôt pratique, qui peut palier à ton problème (si je l'ai bien compris) et même permettre d'avoir plusieurs «constructeurs» avec les mêmes signatures, exemple (bidon) si tu veux générer un pixel RGB, tu peux avoir 3 constructeurs nommés pour faire les nuances d'une couleur unique.
    En bonus, dans certains cas, ça évite de se taper les operator= & Ctors, alors que l'on veux juste ajouter un moyen de convertir un type dans un autre. En malus, je "perds" une partie des conversions automatiques (enfin, surtout parce que j'ai souvent la flemme de me tapper les operator=&Ctors).