7 votes

Avantages de la répartition des étiquettes par rapport à la résolution normale des surcharges

En clair : quel est l'avantage de la répartition des balises par rapport à la résolution normale des surcharges ?

Ce sont tous deux des processus de compilation, n'est-ce pas ? Il ne devrait donc pas y avoir de "gagnant" en termes de performances, je suppose. Et chaque cas de distribution de balises devrait pouvoir, dans une certaine mesure, être réécrit/réfacturé en surcharge normale (éventuellement en ajoutant des types multiples), n'est-ce pas ?

Mis à part la différence de méthode de travail et de sélection des candidats, pourquoi devrais-je préférer la répartition des balises à la résolution des surcharges et dans quels cas ?

9voto

Arunmu Points 2111

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.

2voto

Thomas B Preusser Points 941

Les balises peuvent être associées à un type, y compris les types primitifs de base, par le biais de classes de traits appropriées. Par exemple, il serait impossible de faire d'un type de pointeur une sous-classe d'un concept d'itérateur. Toutefois, une classe de traits modélisée peut l'associer à la balise souhaitée. Ainsi, la répartition basée sur les balises ajoute une flexibilité qui permet de construire un schéma de répartition qui ne doit pas déjà être défini par les types concernés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X