Nous nous appuierons sur une structure
GenFraction, devant faire
partie de l'espace de noms
generic dans le fichier
filter.hpp.
Elle n'est composée que de deux membres
numer et
denom dont
le type (
template) pourra être choisi lors de la création d'une
telle structure.
Il s'agit d'une part de fournir, dans le fichier
filter.hpp,
une fonction
for_each_above() appartenant à l'espace de noms
generic et ayant le prototype suivant :
- elle ne renvoie aucun résultat,
- elle doit parcourir une séquence délimitée par deux itérateurs passés
en paramètres,
- elle consulte en paramètre une donnée de type GenFraction<T>
(dont les membres sont d'un type quelconque),
- elle attend en paramètre une lambda-closure qui pourra être
invoquée sur certains éléments de la séquence.
Puisqu'il s'agit d'une fonction
template, elle sera directement
définie dans le fichier d'en-tête.
Elle se contente de parcourir la séquence indiquée grâce à l'algorithme
std::for_each() :
- pour chaque élément elem rencontré dans la séquence,
- s'il est supérieur à la fraction spécifiée (elem*denom>numer),
- invoquer la lambda-closure transmise, avec comme unique
paramètre elem.
D'autre part, il faut réaliser, dans le fichier
prog_ex0302.cpp, cette
fonction :
void
test_for_each_above()
{
std::cout << "\n~~~~ " << __func__ << "() ~~~~\n";
const generic::GenFraction<int> fraction{13, 2};
const std::array<double, 9> da={1.1, 4.4, 9.9, 2.2, 8.8, 7.7, 5.5, 3.3, 6.6};
// ...use for_each_above() on da and fraction (display)...
std::vector<double> dv={1.1, 4.4, 9.9, 2.2, 8.8, 7.7, 5.5, 3.3, 6.6};
// ...use for_each_above() on dv and fraction (multiply by -1.0)...
for(const auto &elem: dv)
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
qui sera appelée depuis la fonction
main() ; elle doit être
complétée en suivant les commentaires..
Il faut appliquer la fonction
for_each_above() aux éléments de
da afin de les confronter à
fraction et les afficher s'ils
lui sont supérieurs (il ne s'agit donc que d'une consultation de quelques
éléments de
da).
Il faut ensuite appliquer la fonction
for_each_above() aux éléments de
dv afin de les confronter à
fraction et inverser leur signe
s'ils lui sont supérieurs (il s'agit donc d'une modification de quelques
éléments de
dv).