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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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