检查迭代器类型是否为reverse_iterator。

13

有没有办法检查作为参数传递给函数的迭代器是反向迭代器?是否有任何可用的迭代器特性函数可以使用?


确实有std::iterator_traits可以使用。 - Some programmer dude
6
出于好奇,为什么你想这样做?我很难想出一个好的使用案例。 - Marc Glisse
2个回答

10

使用部分特化轻而易举:

#include <iterator>
#include <type_traits>

template<typename Iter>
  struct is_reverse_iterator
  : std::false_type { };

template<typename Iter>
  struct is_reverse_iterator<std::reverse_iterator<Iter>>
  : std::true_type { };

虽然如下所指出,这无法处理“反向-反向”迭代器的情况(在我看来不太可能)。Bathsheba的答案中稍微不那么琐碎的版本可以正确地处理该情况。


1
这个无法很好地处理std::reverse_iterator<std::reverse_iterator<Iter>>。另一个答案可以。 - LogicStuff
5
这两个答案可能会对这个棘手的情况有用的不同处理。取决于你想知道它是否是“reverse_iterator”的原因,你可能希望将双重反向迭代器视为一个(因为它确实是reverse_iterator的实例化类型)或者不将其视为一个(因为它在上下文中迭代“向前”,无论这意味着什么)。 - Steve Jessop

7

我在生产中使用的一些代码:

#include <iterator>
#include <type_traits>
template<typename I>
struct is_reverse_iterator : std::false_type
{
};

template<typename I>
struct is_reverse_iterator<std::reverse_iterator<I>>
: std::integral_constant<bool, !is_reverse_iterator<I>::value>
{
};

+1。谢谢。对于像我这样的新手,标准库中有一些新东西。以前从未听说过std::integral_constantstd::false_type - ubuntugod
1
"我在生产中使用的一些代码" - 你的使用情况是什么?和Marc Glisse一样,我也不明白你为什么要这么做。 - user2357112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接