Tag dispatching
to nazwa nadana technice zastosowanej do znalezienia prawidłowej funkcji przeciążenia. Technicznie jest to tylko przeciążanie.
Aby umieścić go z Boost strony:
Tag dyspozytorskich to sposób korzystania z funkcji przeciążenia wysyłką na podstawie właściwości typu, i jest często używany w parze z cech klas.
Możesz zobaczyć, jak cały plik biblioteki został użyty w standardowej bibliotece algorithm
. Dla przykładu wystarczy wziąć pod uwagę, że istnieje algorytm AlgoX
, który może być wykonywany dużo wydajniej na kontenerze zapewniającym dostęp losowy (np. vector
) niż kontener zapewniający dostęp dwukierunkowy (list
). Tak więc, przy wyborze algorytmu opiera się na jednym iterator type
użyłby tag wysyłki użyciem 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());
}
Jak widać, do prostego umysłu jest niczym innym przykładzie operatora przeciążenia jako kategorie są zasadniczo różne rodzaje.
Aby uzyskać bardziej realistyczny przykład, można wypróbować, w jaki sposób wdrożono std::rotate
.
Wysyłanie oparte na znacznikach uzyskuje się przez przeciążenie. – Arunmu