【问题标题】:What is a difference between iterator_category vs iterator_category() in std::iterator_traitsstd::iterator_traits 中的 iterator_category 与 iterator_category() 有什么区别
【发布时间】:2021-11-08 11:31:37
【问题描述】:

为什么在一种情况下我必须编写不带括号的 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 的实际值?看起来很明显,但我需要一些确认。抱歉问题可能很愚蠢=)

【问题讨论】:

  • 额外的括号是(默认)构造对象。
  • 你明白函数声明和函数调用的区别吗?
  • “这是一个对象字面量”是一个简单的、表面级别的答案,但更好的答案是讨论缺少函数的部分模板特化。

标签: c++ typetraits iterator-traits


【解决方案1】:

如果我理解,iterator_traits::iterator_category 只是一个 typedef

正确。

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

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2021-05-28
    • 2014-07-22
    • 2023-04-09
    相关资源
    最近更新 更多