2016-07-27 20 views
6

Einfach ausgedrückt: Was ist der Vorteil des Tag-Dispatchings gegenüber der normalen Überladungsauflösung?Vorteile der Tag-Dispatching-Funktion gegenüber normaler Übersteuerungsauflösung

Das sind beide Kompilierzeit Prozesse richtig? Es sollte also keinen "Leistungsgewinner" geben. Und jeder Tagversandfall sollte bis zu einem gewissen Grad in normales Überladen (möglicherweise durch Hinzufügen mehrerer Typen) umgeschrieben/refaktorisiert werden können, oder?

Abgesehen von der unterschiedlichen Arbeitsweise und der Auswahl von Kandidaten, warum sollte ich die Tag-Dispatching- und die Overload-Resolution bevorzugen und in welchen Fällen?

+7

Tag-basiertes Dispatching wird durch Überladen erreicht – Arunmu

Antwort

7

Tag dispatching ist ein Name für eine Technik, die verwendet wird, um die korrekte überladene Funktion zu finden. Also, technisch ist es nichts als Überladung nur.

Um es von Boost Website zu setzen:

Tag Dispatching eine Art und Weise der Verwendung Funktion Überlastung ist auf die Eigenschaften eines Typs basiert versenden, und oft Hand in Hand mit Züge Klassen verwendet wird.

Sie können es überall in Ihrer Standardbibliothek verwendet algorithm Header-Datei. Nehmen wir als Beispiel an, dass es einen Algorithmus gibt, der effizienter auf einem Container ausgeführt werden kann, der einen wahlfreien Zugriff bereitstellt (z. B. vector) als ein Container, der einen bidirektionalen Zugriff bereitstellt (list). Also, für den Algorithmus der Auswahl auf der Grundlage des iterator type würde man Tag verwenden Dispatching 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()); 
} 

Verwendung Wie Sie sehen können, auf einen einfachen Geist das ist nichts anderes als ein Beispiel für Betreiber Überlastung als die Kategorien im Wesentlichen unterschiedliche Typen sind.

Für ein realeres Beispiel können Sie auschecken, wie std::rotate implementiert ist.

+0

Die Tatsache, dass Tag-Dispatching stark genutzt wird, beantwortet überhaupt nicht die Frage, warum es verwendet wird. Das OP stellt korrekt fest, dass seine Effekte leicht durch einfaches Überladen von Methoden in Typhierarchien, die unter seiner Kontrolle stehen, erreicht werden können. Das entscheidende Argument ist also, ein benutzerdefiniertes Dispatch-Schema zu implementieren, das von den Typdefinitionen entkoppelt ist. Siehe meine Antwort unten. –

+0

Der Kern meiner Antwort ist im Grunde die ersten 4-5 Zeilen, nicht, dass es in STL verwendet wird. – Arunmu

+0

Große Frage, um diese Antwort zu ergänzen: ** ist Tag-Versand etwas schneller als normale Überladung? ** Ich nehme nicht, da sie beide zur Kompilierzeit implementiert werden, aber ich frage immer noch .. nur um sicher zu sein. – Dean

2

Tags können durch geeignete Merkmalklassen einem Typ zugeordnet werden, einschließlich primitiver Grundtypen. Z. B. wäre es unmöglich, einen Zeigertyp zu einer Unterklasse eines Iteratorkonzepts zu machen. Eine Vorlagenmerkmalsklasse kann sie jedoch dem gewünschten Tag zuordnen. Das Tag-basierte Dispatching fügt somit Flexibilität hinzu, die es ermöglicht, ein Dispatch-Schema zu erstellen, das nicht bereits von den involvierten Typen definiert sein muss.