This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td3:part2 [2019/10/05 14:20] bmonsuez [Question n°2.4] |
in204:tds:sujets:td3:part2 [2022/11/18 10:49] (current) |
||
---|---|---|---|
Line 44: | Line 44: | ||
<hidden Correction> | <hidden Correction> | ||
+ | |||
Supposons d'abord que nous souhaitons appelé la fonction ''generic::populate_with_randoms'' en lui passant un tableau de type ''std::string'' avec le code suivant : | Supposons d'abord que nous souhaitons appelé la fonction ''generic::populate_with_randoms'' en lui passant un tableau de type ''std::string'' avec le code suivant : | ||
Line 84: | Line 85: | ||
} | } | ||
</code> | </code> | ||
- | |||
</hidden> | </hidden> | ||
===== Question n°2 ===== | ===== Question n°2 ===== | ||
Line 144: | Line 144: | ||
<hidden Correction> | <hidden Correction> | ||
- | Nous ajoutons à la liste des paramètres de types de la fonction, un paramètre supplémentaire qui correspond au type d'une classe qui doit exposer une méthode statique permettant de tester si une valeur est plus grande qu'une autre valeur pour des valeurs de types ''T'' et ayant pour nom ''is_greater''. | + | Nous ajoutons à la liste des paramètres de types de la fonction, un paramètre supplémentaire ''sortTraits'' qui correspond au type d'une classe qui doit exposer une méthode statique permettant de tester si une valeur est plus grande qu'une autre valeur pour des valeurs de types ''T'' et ayant pour nom ''is_greater''. |
- | Cependant, ce paramètre est facultatif, par défaut, nous considérons que ce paramètre est initialisé à ''greater_traits<T>''. | + | Cependant, ce paramètre de type est facultatif, par défaut, nous considérons que ce paramètre est initialisé à ''greater_traits<T>''. |
+ | |||
+ | Maintenant, nous avons un premier souci. Au moins un paramètre de la fonction doit faire référence à un paramètre de types. Cependant, nous n'avons aucun paramètre qui n'a le type ''sortTraits''. Enfin, nous ne créons aucun objet de type ''sortTraits'' que nous allons passer en paramètre. Pour contourner ce problème, nous allons ajouter un paramètre supplémentaire à la fonction qui sera un pointeur sur un objet de type ''sortTraits'' et qui sera initialisé à ''NULL''. | ||
+ | <code cpp> | ||
+ | void simple_sort(std::vector<T>& theValues, sortTraits* = NULL) | ||
+ | </code> | ||
+ | |||
+ | Comme nous n'utilisons jamais ce paramètre, nous ne donnons même pas de nom à ce paramètre ! Il n'est là que pour respecter la règle qui impose que tout paramètre de type doit être référencé directement ou undirectement par au moins un paramètre de la fonction. | ||
Nous modifions ensuite l'opération de comparaison pour désormais faire appel à la méthode statique ''is_greater'' de la classe de type ''sortTraits''. | Nous modifions ensuite l'opération de comparaison pour désormais faire appel à la méthode statique ''is_greater'' de la classe de type ''sortTraits''. | ||
Line 155: | Line 162: | ||
... | ... | ||
- | template<typename T, typename sortTraits = greater_traits<T>> | + | template<typename T, typename sortTraits = greater_traits<T>> |
- | | + | void simple_sort(std::vector<T>& theValues, sortTraits* = NULL) |
- | void simple_sort(std::vector<T>& theValues) | + | |
{ | { | ||
int length = theValues.size(); | int length = theValues.size(); | ||
Line 171: | Line 177: | ||
... | ... | ||
} | } | ||
+ | </code> | ||
</hidden> | </hidden> | ||
Line 192: | Line 199: | ||
}; | }; | ||
</code> | </code> | ||
- | |||
</hidden> | </hidden> | ||
Line 311: | Line 317: | ||
Dans ce cas, quand le compilateur compile le code ''simple_sort'', il peut inférer que : | Dans ce cas, quand le compilateur compile le code ''simple_sort'', il peut inférer que : | ||
* T dénote le type entier ''int'', | * T dénote le type entier ''int'', | ||
- | * aucun argument n'est passé pour le paramètre ''traits, le type n'est pas résolu. | + | * aucun argument n'est passé pour le paramètre ''traits'', le type n'est pas résolu. |
Il reste donc à résoudre le type ''sortTraits''. | Il reste donc à résoudre le type ''sortTraits''. | ||
* aucun type n'est passé en paramètre à la fonction ''simple_sort'' | * aucun type n'est passé en paramètre à la fonction ''simple_sort'' | ||
Line 333: | Line 339: | ||
Dans ce cas, quand le compilateur compile le code ''simple_sort'', il peut inférer que : | Dans ce cas, quand le compilateur compile le code ''simple_sort'', il peut inférer que : | ||
* T dénote le type entier ''int'', | * T dénote le type entier ''int'', | ||
- | * aucun argument n'est passé pour le paramètre ''traits, le type n'est pas résolu. | + | * aucun argument n'est passé pour le paramètre ''traits'', le type n'est pas résolu. |
Il reste donc à résoudre le type ''sortTraits''. | Il reste donc à résoudre le type ''sortTraits''. | ||
* le type ''lower_traits<int>'' est passé en paramètre à la fonction ''simple_sort''. Dans ce cas, le compilateur affecte à ''sortTraits'' le type par défaut, c'est-à-dire ''lower_traits<int>''. | * le type ''lower_traits<int>'' est passé en paramètre à la fonction ''simple_sort''. Dans ce cas, le compilateur affecte à ''sortTraits'' le type par défaut, c'est-à-dire ''lower_traits<int>''. | ||
Line 374: | Line 380: | ||
greater_or_lower_traits<int>()); | greater_or_lower_traits<int>()); | ||
</code> | </code> | ||
+ | |||
</hidden> | </hidden> |