繁体   English   中英

std::iterator_traits 中的 iterator_category 与 iterator_category() 有什么区别

[英]What is a difference between iterator_category vs iterator_category() in std::iterator_traits

为什么在一种情况下我必须编写不带括号的 iterator_category:

template<typename Iterator>
void my_advance(Iterator &iter, int n)
{
    if constexpr(std::is_same_v<
            typename std::iterator_traits<Iterator>::iterator_category,
            std::random_access_iterator_tag>)
        iter += n;
    else
        for(int i = 0; i<n; ++i, ++iter);
}

在另一种情况下,带括号:

template<typename Iterator, typename IterCategory>
void my_advance_helper(Iterator &iter, int n, IterCategory){
    for(int i = 0; i < n; ++i, ++iter);
}

template<typename Iterator>
void my_advance_helper(Iterator &iter, int n, std::random_access_iterator_tag){
    iter += n;
}

template<typename Iterator>
void my_advance(Iterator &iter, int n)
{
    my_advance_helper(iter, n,
    typename std::iterator_traits<Iterator>::iterator_category());
}

如果据我所知, iterator_traits::iterator_category 只是一个 typedef。 括号在最后一种情况下有什么作用? 他们是否以这种方式返回 iterator_category 的实际值? 看起来很明显,但我需要一些确认。 对不起,问题可能很愚蠢=)

如果据我所知, iterator_traits::iterator_category 只是一个 typedef

正确的。

括号在最后一种情况下有什么作用?

这是临时对象的值初始化的语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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