• [^] # Re: ouai

    Posté par (site web personnel) . En réponse au journal Données vs Code. Évalué à 6.

    Je ne vois pas bien la différence entre un type fantôme et un type (mais te fatigue pas je pense qu'il faudrait que je manipule tout ça pour commencer à comprendre _).

    En réalité il y a un type fantôme avec lequel tu es déjà familier, c'est le void en C. On ne peut pas créer de valeurs de de type void par contre on peut créer des types dérivés, comme pointer to void – que je n'écris pas avec une petit étoile à cause du markdown.

    Un type fantôme est juste un type qui est déclaré mais pas défini, comme dans

    type my_first_fantom_type
    

    On ne peut pas créer de valeurs de type my_first_fantom_type par contre on peut s'en servir pour paramétrer d'autres types. L'équivalent en C++ serait d'utiliser des templates et leurs spécialisation. J'essaie de traduire mon example OCaml en déclarations C++, mais mon C++ n'est plus tout frais:

    struct validation_pending {};
    struct validation_done {};
    template<struct T>
    struct password {
     typedef string type;
    };
    password<validation_pending>::type
    password_input();
    password<validation_done>::type
    password_validate(const password<validation_pending>::type&);
    void
    password_store(const password<validation_done>::type&);
    

    Le paramètre de template, qui correspond au paramètre de type dans le cas de OCaml, sert uniquement à "documenter" l'API aux yeux du compilateur – mais je ne connais malheureusement aucune astuce en C++ pour rendre les types password<validation_pending>::type
    et password<validation_done>::type incompatibles entre eux, donc la correspondance est imparfaite.