Voici quelque chose que je fais souvent, ce n'est pas joli, mais c'est simple et utile.
Je travaille souvent avec des conteneurs de modèles qui mettent en œuvre une interface, imaginer quelque chose comme
template<class T>
class MyVector : public ContainerInterface
...
Où ContainerInterface a des choses utiles de base, mais c'est tout. Si je veux un algorithme spécifique sur les vecteurs d'entiers sans exposer mon implémentation de modèle, il est utile d'accepter les objets d'interface et de les mettre en dynamique vers MyVector dans l'implémentation. Exemple:
// function prototype (public API, in the header file)
void ProcessVector(ContainerInterface& vecIfce);
// function implementation (private, in the .cpp file)
void ProcessVector(ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
Je pourrais ajouter une méthode Process() à la ContainerInterface qui serait résolu polymorphically, ce serait une méthode plus agréable POO, mais je préfère parfois le faire de cette façon. Lorsque vous avez des conteneurs simples, beaucoup d'algorithmes et que vous voulez garder votre implémentation cachée, dynamic_cast offre une solution facile et laide.
Vous pouvez également examiner les techniques de double expédition.
HTH
Le titre de cette question ne correspond pas exactement à la description. – bradtgmurray