Dans l’exercice précédent, nous avons signalé que nous avons perdu en généralité par rapport à la technique de passage de pointeur de fonction, puisque la fonction moulinette() est limitée à un seul type de traitement.
Nous allons maintenant lui rendre sa généralité.
Pour mettre la chaîne en majuscules par exemple, il faut commencer par écrire la nouvelle classe ToUpper, et y surcharger l’opérateur () adéquat.
Pour que la fonction moulinette() puisse mettre la chaîne en majuscules ou en minuscules (ou effectuer toute autre transformation), il faut utiliser le polymorphisme.
Travail à effectuer
Créer le projet FunctorAbstrait.
Dans votre fichier main.cpp copier le fichier TestFunctorAbstrait.cpp
/**
*
* @file TestFunctorAbstrait.cpp
*
* @authors M. Laporte, D. Mathieu
*
* @date 27/04/2010
*
* @version V1.0
*
* @brief functor abstrait
*
**/
#include <string>
#include <iostream>
#include <cctype> // ispunct(), islower(), isalpha()
// tolower(), toupper()
#include <cassert>
using namespace std;
namespace
{
class ToLower
{
public :
virtual ~ToLower (void) {}
virtual int operator () (int caract) const
{
return tolower (caract);
} // operateur()
}; // CToLower
string & moulinette (string & str, const ToLower & transf)
{
for (string::size_type i (str.size ()); i--; )
str [i] = transf (str [i]);
return str;
} // moulinette()
void testFunctor (void)
{
cout << "Functor abstrait : ";
string ligne ("azert:;,.?GFDSQ");
string minusc ("azert:;,.?gfdsq");
string majusc ("AZERT:;,.?GFDSQ");
string sansPunct ("AZERT GFDSQ");
// ToDo
assert (minusc == moulinette (ligne, ...));
assert (majusc == moulinette (ligne, ...));
assert (sansPunct == moulinette (ligne, ...));
cout << "OK\n";
} // testFunctor ()
} // namespace anonyme
int main (void)
{
/* */ testFunctor (); /* */
return 0;
} // main()
Dans l’espace de noms anonyme, ajoutez-lui la classe abstraite ITraitCar dont l’unique fonction-membre abstraite a le même profil que tolower(), toupper(), etc.
N’oubliez pas son destructeur virtuel !
Faites dériver publiquement la classe ToLower de ITraitCar.
Sur le même modèle, écrivez les nouvelles classes ToUpper et IgnPunct qui transforment respectivement les minuscules en majuscules et les caractères de ponctuation en espaces.
Modifiez le type du second paramètre de moulinette() en conséquence.
Le tour est joué !
Dans la fonction testFunctor (), complétez les instructions assert().
Compilez et testez.