• [^] # Re: Typage structurel

    Posté par . En réponse au journal C++ Hell/Heaven et les concepts. Évalué à 2.

    Quand une classe/fonction attend comme paramètre une classe ou un objet ayant une particularité. En c++ 03 il n'y a aucun moyen de la préciser.

    Si la contrainte n'est pas respectée le compilateur renvoie alors un message d'erreur au moment de l'utilisation de la particularité. Ce qui était rarement clair.

    En C++ 20 on peut préciser lors de la déclaration de la classe/fonction ce qui est attendu.

    Ex pour une fonction similaire à std::find_if qui attend qui attend un objet 'p' possédant un fonction "comp()" retournant un bool.

    En C++ 03:

    template <class T, class P > bool MyFind(T first, T last, P p);

    la classe P n'a aucune contrainte précisée dans la définition de la fonction.

    En C++ 20:

    template< typename V ,typename T >
    concept MyPredicate = requires(T a, V v ) 
    {
     { v.comp(*a) } -> std::convertible_to<bool>;
    };
    template <class T, MyPredicate<T> P >
    bool MyFind(T first, T last, P p);

    En C++ 20 on peut définir MyPredicate avec la contrainte obligeant l'objet à posséder une fonction "comp()".

    Si jamais la condition n'est pas respectée, voici le genre d'erreurs retournées dans GCC 10:

    ../macro.cpp: In instantiation of ‘bool MyFind(T, T, P) [with T = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; P = MyCompare]’:
    ../macro.cpp:48:42: required from here
    ../macro.cpp:28:9: required for the satisfaction of ‘MyPredicate<P, T>’ [with P = MyCompare; T = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >]
    ../macro.cpp:28:23: in requirements with ‘T a’, ‘V v’ [with V = MyCompare; T = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >]
    ../macro.cpp:30:10: note: the required expression ‘v.comp((* a))’ is invalid
     30 | { v.comp(*a) } -> std::convertible_to<bool>;