简单明了:与常规的过载解析相比,标签分发有什么优势?
这些都是编译时过程,对吗?因此,我认为不应有“表现优胜者”。并且每个标签分派(dispatch)情况在某种程度上都应该能够被重写/重构为正常的重载(可能通过添加多种类型),对吗?
除了使用不同的工作方式和选择候选者之外,为什么我应该更喜欢标签分配而不是过载解析?在哪种情况下?
最佳答案
Tag dispatching
基本上是为找到正确的重载函数而使用的技术的名称。因此,从技术上讲,它不过是重载而已。
要从Boost网站放置它:
您可以在标准库algorithm
头文件中看到它已全部使用。仅出于示例的目的,考虑存在一种算法AlgoX
,与提供双向访问的容器(vector
)相比,该算法可以在提供随机访问的容器(例如list
)上更有效地执行。因此,要选择基于iterator type
的算法,可以使用使用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());
}
如您所见,简单来说,这不过是运算符重载的一个示例,因为类别本质上是不同的类型。
对于更真实的示例,您可以 checkout
std::rotate
的实现方式。关于c++ - 标签分发优于常规过载解析的优势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38623142/