Dea*_*ean 7 c++ templates template-meta-programming
简单明了:标签调度优于正常的重载分辨率有什么优势?
这些都是编译时进程吗?所以我认为不应该有"表现优胜者".并且每个标签调度案例都应该能够在某种程度上被重写/重构为正常的重载(可能通过添加多种类型),对吗?
除了工作和选择候选人的不同方式之外,为什么我更喜欢标签调度而不是重载决策?在哪些情况下?
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());
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,简单来说,这只是运算符重载的一个示例,因为类别本质上是不同的类型.
有关更真实的示例,您可以查看std::rotate实现方式.