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++ 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>;
[^] # Re: Typage structurel
Posté par gorbal . 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:
la classe P n'a aucune contrainte précisée dans la définition de la fonction.
En C++ 20:
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: