正向迭代器的重载

时间:2017-11-13 19:45:19

标签: c++ templates iterator overloading libc++

在查看libc ++时,我发现当模板参数是前向迭代器时,有两种不同的方法来重载函数。

第一种方法是使用std::iterator_traits::iterator_category

template <class ForwardIter1, class ForwardIter2>
inline
bool
__some_function(ForwardIter1 first1, ForwardIter1 last1,
                ForwardIter2 first2, ForwardIter2 last2,
                std::forward_iterator_tag, std::forward_iterator_tag)
{
    // do stuff ...

    return true;
}


template <class InputIter1, class InputIter2>
inline
bool
__some_function(InputIter1 first1, InputIter1 last1,
                InputIter2 first2, InputIter2 last2,
                std::input_iterator_tag, std::input_iterator_tag)
{
    // do stuff ...

    return true;
}


template <class InputIter1, class InputIter2>
inline
bool
some_function(InputIter1 first1, InputIter1 last1,
              InputIter2 first2, InputIter2 last2)
{
    return __some_function(first1, last1, first2, last2,
                           typename std::iterator_traits<InputIter1>::iterator_category(),
                           typename std::iterator_traits<InputIter2>::iterator_category());
}

但我也看到std::enable_if

的使用
template <class ForwardIter1, class ForwardIter2>
inline
bool
some_function(ForwardIter1 first1, ForwardIter1 last1,
              ForwardIter2 first2, ForwardIter2 last2,
              typename std::enable_if<
                  __is_forward_iterator<ForwardIter1>::value &&
                  __is_forward_iterator<ForwardIter2>::value
              >::type* = 0)
{
    // do stuff ...

    return true;
}


template <class InputIter1, class InputIter2>
inline
bool
some_function(InputIter1 first1, InputIter1 last1,
              InputIter2 first2, InputIter2 last2,
              typename std::enable_if<
                  __is_exactly_input_iterator<InputIter1>::value &&
                  __is_exactly_input_iterator<InputIter2>::value
              >::type* = 0)
{
    // do stuff ...

    return true;
}

这两者中的哪一个是解决问题的“首选”方式,或者取决于具体情况。在那种情况下,何时一种解决方案比另一种更好?

1 个答案:

答案 0 :(得分:1)

更好的方法是使用enable if作为返回类型,因此无需将任何额外参数(使用默认值)传递给函数:

template <class ForwardIter1, class ForwardIter2>
typename std::enable_if
<
    __is_forward_iterator<ForwardIter1>::value
    &&
    __is_forward_iterator<ForwardIter2>::value
,   bool
>::type
some_function
(
    ForwardIter1 first1, ForwardIter1 last1
,   ForwardIter2 first2, ForwardIter2 last2
)
{
    // do stuff ...
    return(true);
}

此外,还保留带有双下划线的标识符,但我们假设__is_forward_iterator模板有效且存在于某处。