简单明了:与常规的过载解析相比,标签分发有什么优势?

这些都是编译时过程,对吗?因此,我认为不应有“表现优胜者”。并且每个标签分派(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/

10-10 08:08