Tag dispatching
est essentiellement un nom donné à une technique employée pour trouver la bonne fonction surchargée. Donc, techniquement, ce n'est rien d'autre que de la surcharge.
Pour dire les choses telles qu'elles sont Boost site :
La répartition des balises est une façon d'utiliser la surcharge des fonctions pour répartir les balises en fonction des propriétés d'un type, et est souvent utilisé avec les classes de type classes de traits.
Vous pouvez le voir utilisé un peu partout dans votre bibliothèque standard. algorithm
fichier d'en-tête. À titre d'exemple, considérons qu'il existe un algorithme AlgoX
ce qui peut être réalisé beaucoup plus efficacement sur un conteneur fournissant un accès aléatoire (ex. vector
) qu'un conteneur offrant un accès bidirectionnel ( list
). Ainsi, pour sélectionner l'algorithme en fonction de la iterator type
on utiliserait la répartition des balises en utilisant iterator_traits
template <typename Iter>
void AlgoXImpl(Iter first, Iter last, bidirectional_iterator_tag) {
//.....Algo specialized to bidirectional iterators
}
template <typename Iter>
void AlgoXImpl(Iter first, Iter last, random_access_iterator_tag) {
//.....Algo specialized to random access iterators
}
template <typename Iter>
void AlgoX(Iter first, Iter last) {
if (first == last) return;
AlgoXImpl(first, last, typename iterator_traits<Iter>::iterator_category());
}
Comme vous pouvez le voir, pour un esprit simple, ce n'est rien d'autre qu'un exemple de surcharge d'opérateurs, car les catégories sont essentiellement des types différents.
Pour un exemple plus concret, vous pouvez vérifier comment std::rotate
est mis en œuvre.