简单明了:标签调度优于正常的重载分辨率有什么优势?
这些都是编译时进程吗?所以我认为不应该有“表现优胜者”。并且每个标签调度案例应该能够在某种程度上被重写/重构为正常的重载(可能通过添加多种类型),对吗?
除了工作和选择候选人的不同方式之外,为什么我更喜欢标签调度而不是重载决议?在哪种情况下?
答案 0 :(得分:9)
Tag dispatching
基本上是用于找到正确的重载函数的技术的名称。所以,从技术上讲,它只是超载。
将其从Boost网站:
中删除标签调度是一种使用函数重载进行调度的方法 基于类型的属性,并且经常与手拉手使用 特质班。
您可以在标准库algorithm
头文件中看到它全部使用。仅仅为了一个例子,考虑有一个算法AlgoX
,它可以在提供随机访问的容器(例如vector
)上比提供双向访问的容器更有效地执行({{ 1}})。因此,要根据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());
}
的实施方式。
答案 1 :(得分:2)
标签可以通过适当的特征类与类型相关联,甚至包括基本的基元类型。例如,将指针类型作为某些迭代器概念的子类是不可能的。但是,模板化特征类可以将其与所需标记相关联。因此,基于标记的调度增加了灵活性,允许构建一个必须尚未由相关类型定义的调度方案。