标签调度相对于正常重载解析的优势
Advantages of tag dispatching over normal overload resolution
简单明了:与正常的重载解析相比,标记分派有何优势?
这些都是编译时进程吧?所以我想不应该有 'performance winner' 。而且每个标签派发case在某种程度上应该可以rewritten/refactored正常重载(可能通过添加多种类型),对吧?
除了工作和选择候选人的不同方式之外,为什么我更喜欢标签调度而不是重载解析,在哪些情况下?
Tag dispatching
基本上是一种用于查找正确重载函数的技术的名称。所以,从技术上讲,它只不过是超载而已。
从 Boost 网站:
Tag dispatching is a way of using function overloading to dispatch
based on properties of a type, and is often used hand in hand with
traits classes.
你可以看到它在你的标准库 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());
}
如您所见,简单来说,这不过是运算符重载的一个示例,因为类别本质上是不同的类型。
如需更真实的示例,您可以查看 std::rotate
的实现方式。
标签可以通过适当的特征 classes 与类型相关联,甚至包括基本原始类型。例如,不可能使指针类型成为某个迭代器概念的 subclass。但是,模板化特征 class 可能会将其与所需的标签相关联。因此,基于标签的调度增加了灵活性,允许构建一个必须尚未由相关类型定义的调度方案。
简单明了:与正常的重载解析相比,标记分派有何优势?
这些都是编译时进程吧?所以我想不应该有 'performance winner' 。而且每个标签派发case在某种程度上应该可以rewritten/refactored正常重载(可能通过添加多种类型),对吧?
除了工作和选择候选人的不同方式之外,为什么我更喜欢标签调度而不是重载解析,在哪些情况下?
Tag dispatching
基本上是一种用于查找正确重载函数的技术的名称。所以,从技术上讲,它只不过是超载而已。
从 Boost 网站:
Tag dispatching is a way of using function overloading to dispatch based on properties of a type, and is often used hand in hand with traits classes.
你可以看到它在你的标准库 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());
}
如您所见,简单来说,这不过是运算符重载的一个示例,因为类别本质上是不同的类型。
如需更真实的示例,您可以查看 std::rotate
的实现方式。
标签可以通过适当的特征 classes 与类型相关联,甚至包括基本原始类型。例如,不可能使指针类型成为某个迭代器概念的 subclass。但是,模板化特征 class 可能会将其与所需的标签相关联。因此,基于标签的调度增加了灵活性,允许构建一个必须尚未由相关类型定义的调度方案。