[英]Template class specialization vs function overloading
标题不是最好的,所以让我解释一下:我正在试验一个自定义的mini-stl(出于学习目的),当前正在实现std::distance
函数。 对于随机访问迭代器和简单输入迭代器,该函数的行为必须有所不同。
函数重载
std(在Microsoft的实现中)和EASTL都使用运算符重载来选择适当的函数,如下所示:
namespace internal
{
template <typename Iter>
inline typename IteratorTraits<Iter>::DifferenceType DistanceImpl(Iter first, Iter last, InputIteratorTag)
{
// ...
}
template <typename Iter>
inline typename IteratorTraits<Iter>::DifferenceType DistanceImpl(Iter first, Iter last, RandomAccessIteratorTag)
{
// ...
}
}
template <typename Iter>
inline typename IteratorTraits<Iter>::DifferenceType Distance(Iter first, Iter last)
{
// the last parameter of the function selects the proper DistanceImpl
return internal::DistanceImpl<Iter>(first, last, (typename IteratorTraits<Iter>::IteratorCategory)());
}
我猜临时对象(类别标记参数是一个空结构)将被优化掉,因为它没有被使用。
具有静态功能的类专门化
带有静态函数的辅助类的专业化如何?
namespace internal
{
template <typename Cat>
struct DistanceImpl;
template <>
struct DistanceImpl<InputIteratorTag>
{
template <typename Iter>
inline static typename IteratorTraits<Iter>::DifferenceType Calc(Iter first, Iter last)
{
// ...
}
};
template <>
struct DistanceImpl<RandomAccessIteratorTag>
{
template <typename Iter>
inline static typename IteratorTraits<Iter>::DifferenceType Calc(Iter first, Iter last)
{
// ...
}
};
}
template <typename Iter>
inline typename IteratorTraits<Iter>::DifferenceType Distance(Iter first, Iter last)
{
return internal::DistanceImpl<typename IteratorTraits<Iter>::IteratorCategory>::Calc<Iter>(first, last);
}
问题
标记分派可自动处理继承层次结构; 明确的专业则没有。 这是迭代器尤为重要,因为迭代器分类标签形成一个继承层次: random_access_iterator_tag
派生自bidirectional_iterator_tag
从派生forward_iterator_tag
从派生input_iterator_tag
。
通过选择输入迭代器重载为它提供前向或双向迭代器时,第一个版本即开即用。 第二个不需要,并且需要其他专业化或其他一些更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.