Surdéfinition de l'opérateur de cast (void *)
Bonjour,
J'étais en train d'étudier le mécanisme qui permet de réaliser l'opération suivante avec un flot tel que, par exemple, cin:
Code:
1 2 3 4 5 6 7 8
| using namespace std;
// ...
char c;
// ...
// Recopie le flot cin sur le flot cout
while ( cin.get(c) ){
cout.put(c);
} |
Le fonctionnement du morceau de code ci-dessus passe par la surchage de l'opérateur de cast (void*). Je me suis donc construit un petit exemple afin d'étudier ce mécanisme. Il s'agit d'une classe qui représente un index de boucle. Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <iostream>
/*
* Représente un index de boucle.
*
* Aucun autre intérêt que celui d'étudier la surchage de l'opérateur
* (void*) comme c'est le cas pour les flots d'entrée/sortie
*/
class IndexBoucle {
int i; // Valeur de l'entier
int max; // i doit rester inférieur à max
public:
// Constructeur de la classe
IndexBoucle(int limite)
{
if ( i<limite )
{
i = 0;
max = limite;
}
}
// Accesseur permettant d'obtenir i
int getIndex()
{
return i;
}
// Surcharge de l'opérateur de cast (void*)
operator void*()
{
return (++i<max) ? this : NULL;
}
};
int main()
{
IndexBoucle i(10);
/* La valeur de l'index est incémentée au sein de
* IndexBoucle::operator void*() qui renvoit NULL
* lorsque l'index vaut 10.
*/
while (i)
{
std::cout << "Iteration " << i.getIndex() << std::endl;
}
return 0;
} |
Tout fonctionne parfaitement, mais je voudrais savoir à quel niveau intervient le cast (void *) dans la construction:
Y a-t'il conversion implicite de i (ici un objet de type IndexBoucle, mais cela peut également être un flot dont on désire tester le status d'erreur) en un pointeur générique? Est-ce un point définit par la norme ou est-ce que cela dépend de l'implémentation?
Merci d'avance pour avis
Meilleures salutations
Thierry