繁体   English   中英

模板类专业化与函数重载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM