标签调度优于正常重载分辨率的优点

时间:2016-07-27 21:03:21

标签: c++ templates template-meta-programming

简单明了:标签调度优于正常的重载分辨率有什么优势?

这些都是编译时进程吗?所以我认为不应该有“表现优胜者”。并且每个标签调度案例应该能够在某种程度上被重写/重构为正常的重载(可能通过添加多种类型),对吗?

除了工作和选择候选人的不同方式之外,为什么我更喜欢标签调度而不是重载决议?在哪种情况下?

2 个答案:

答案 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)

标签可以通过适当的特征类与类型相关联,甚至包括基本的基元类型。例如,将指针类型作为某些迭代器概念的子类是不可能的。但是,模板化特征类可以将其与所需标记相关联。因此,基于标记的调度增加了灵活性,允许构建一个必须尚未由相关类型定义的调度方案。