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。括号在最后一种情况下做什么?他们 return 实际价值 iterator_category 这样吗?看起来很明显,但我需要一些确认。抱歉问题可能很愚蠢=)
If as i understand, iterator_traits::iterator_category is just a typedef
正确。
What do parentheses do in last case?
这是临时对象值初始化的语法。
为什么在一种情况下我必须写 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。括号在最后一种情况下做什么?他们 return 实际价值 iterator_category 这样吗?看起来很明显,但我需要一些确认。抱歉问题可能很愚蠢=)
If as i understand, iterator_traits::iterator_category is just a typedef
正确。
What do parentheses do in last case?
这是临时对象值初始化的语法。