【问题标题】:Check if iterator's type is reverse_iterator检查迭代器的类型是否为 reverse_iterator
【发布时间】:2016-05-26 07:51:34
【问题描述】:

有没有办法检查作为 arg 传递给 fnc 的迭代器是否是 reverse_iterator?有没有我可以使用的迭代器特征函数?

【问题讨论】:

  • 确实有std::iterator_traits可以使用。
  • 出于好奇,您为什么要这样做?我很难想出一个好的用例。

标签: c++ iterator reverse-iterator


【解决方案1】:

用偏特化来写很简单:

#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 的答案中稍微不那么琐碎的版本正确处理了这种情况。

【讨论】:

  • 这不能很好地处理std::reverse_iterator&lt;std::reverse_iterator&lt;Iter&gt;&gt;。另一个答案会。
  • 对于这个棘手的案例,这两个答案可能会做有用​​的不同事情。根据您想知道它是否为reverse_iterator 的原因,您可能希望将双反向迭代器视为一个(因为它确实属于reverse_iterator 的实例化类型)或不是一个(因为它迭代“转发”,无论在上下文中意味着什么)。
【解决方案2】:

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

#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 库的一些新东西。从来不知道std::integral_constantstd::false_type
  • “我在生产中使用的一些代码” - 你的用例是什么?像 Marc Glisse 一样,我不明白你为什么要这样做。
猜你喜欢
  • 2012-08-15
  • 2019-02-25
  • 1970-01-01
  • 2018-05-16
  • 2017-06-05
  • 2011-01-04
  • 2023-04-10
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多