Non, rien à voir. le type de retour dans ce cas là serait l'équivalent du type de retour de ta fonction virtuelle.
L'interrêt ici est plutot de séparé le code et les données.
Exemple fréquent dans un compilateur: tu as une classe de base (Statement) et des classe dérivée (IfStatement et ForStatement)
Ensuite tu veux écrire des passe d'optimisation, tu pourrais aoir quelque chose comme ça:
// Statement.hclassStatement{/*... */virtualvoidoptimizeConstantPropagation()=0;virtualvoidoptimizeDeadCode()=0;};// IfStatement.hclassIfStatement:Statement{/* ... */virtualvoidoptimizeDeadCode(){if(condition->isConstant()){/*..remove one branch of the if .. */}// recursecondition->optimizeDeadCode();thenBranch->optimizeDeadCode();elseBranch->optimizeDeadCode();}};
On voit deux problème:
1. la partie 'recurse' devra être répété dans toutes les passes d'optimisation.
2. Si je veux créé une nouvelle passe d'optimisation, je dois rajouter une fonction dans toute les classes. Alors que justement, les passes d'optimisations devraient être modulaire et contenue dans un seul fichier.
Le visiteur pattern permet de résoudre ces deux problèmes.
[^] # Re: Compréhension
Posté par Gof (site web personnel) . En réponse au journal Visiteurs en C++. Évalué à 2.
Non, rien à voir. le type de retour dans ce cas là serait l'équivalent du type de retour de ta fonction virtuelle.
L'interrêt ici est plutot de séparé le code et les données.
Exemple fréquent dans un compilateur: tu as une classe de base (Statement) et des classe dérivée (IfStatement et ForStatement)
Ensuite tu veux écrire des passe d'optimisation, tu pourrais aoir quelque chose comme ça:
On voit deux problème:
1. la partie 'recurse' devra être répété dans toutes les passes d'optimisation.
2. Si je veux créé une nouvelle passe d'optimisation, je dois rajouter une fonction dans toute les classes. Alors que justement, les passes d'optimisations devraient être modulaire et contenue dans un seul fichier.
Le visiteur pattern permet de résoudre ces deux problèmes.