【发布时间】:2016-05-26 07:51:34
【问题描述】:
有没有办法检查作为 arg 传递给 fnc 的迭代器是否是 reverse_iterator?有没有我可以使用的迭代器特征函数?
【问题讨论】:
-
确实有
std::iterator_traits可以使用。 -
出于好奇,您为什么要这样做?我很难想出一个好的用例。
标签: c++ iterator reverse-iterator
有没有办法检查作为 arg 传递给 fnc 的迭代器是否是 reverse_iterator?有没有我可以使用的迭代器特征函数?
【问题讨论】:
std::iterator_traits可以使用。
标签: c++ iterator reverse-iterator
用偏特化来写很简单:
#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<std::reverse_iterator<Iter>>。另一个答案会。
reverse_iterator 的原因,您可能希望将双反向迭代器视为一个(因为它确实属于reverse_iterator 的实例化类型)或不是一个(因为它迭代“转发”,无论在上下文中意味着什么)。
我在生产中使用的一些代码:
#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>
{
};
【讨论】:
std::integral_constant,std::false_type