【问题标题】:Is there a way to check if an iterator is random_access within an IF statement in C++? [duplicate]有没有办法在 C++ 的 IF 语句中检查迭代器是否是 random_access? [复制]
【发布时间】:2020-06-28 04:30:19
【问题描述】:

由于大小的原因,为相关函数创建模板化重载不是一个可行的解决方案,所以有没有办法在不使用模板和 enable_if 等的情况下检查迭代器是否是随机访问???

例如 - 类似:

if (std::iterator_traitzzz<it>::the_type == random_access_yo)
{ 
   DO THE THING
}

编辑:This answer 是佳能之一,我认为,虽然 R Sahu 的下面的一个也不错。

【问题讨论】:

  • 抱歉错误标记。我添加了另一个标志来解释它。您能否添加模板帖子并指出它不是您想要的解决方案?
  • @LouisGo 对不起,完全是我的错-我没有阅读该页面上的第二个答案,并且错过了非模板答案。随意重新标记为重复,但 R Sahu 的解决方案也适用于此,尽管在非随机访问迭代器上使用 make_move_iterator 时它会失败。
  • 你的意思是这个答案吗? stackoverflow.com/a/47994437/4123703您可以编辑您的帖子以包含链接,因为您的问题更容易搜索。
  • 好点 - 我会的。

标签: c++ iterator


【解决方案1】:

你可以使用

template< class, class = void >
struct is_random_access_itertor : std::false_type { };

template< class T >
struct is_random_access_itertor<T,
           std::void_t<decltype(T()+10), decltype(*T())>> : std::true_type { };

推断T是否是一个随机访问迭代器。它利用随机访问迭代器类型的两个特点进行推演。

  1. T() + 10 是一个有效的表达式。
  2. *T() 是一个有效的表达式。

您可以添加随机访问迭代器的其他特性以使推导更加稳健。

现在,你可以使用

if constexpr ( is_random_access_itertor<decltype(it)>::value )
{
   // Yes, it is a random access iterator.
}

【讨论】:

  • 很好的答案,但是在 std::make_move_iterator 从非随机访问迭代器生成的迭代器上使用时会出错。不确定那里缺少什么。考虑到链接(重复)问题中的第二个答案,这里的获胜者更简洁,但这是紧随其后的第二个答案。
猜你喜欢
  • 2021-08-11
  • 2021-01-25
  • 2021-05-25
  • 2011-02-19
  • 2011-02-10
  • 2011-06-03
  • 2011-05-16
  • 2011-01-04
  • 2012-06-30
相关资源
最近更新 更多