繁体   English   中英

如何使用 iterator_category 表示自定义迭代器 class 的标签?

[英]How to use iterator_category to indicate the tag of a customized iterator class?

如标题所示,即使我定义了类型“iterator_category”并使其在 class 定义中对外部可见,以下代码片段也不起作用,output 的期望应该是“1”而不是“0”。 我应该如何解决这个问题?

struct Iter {
  using iterator_category = std::random_access_iterator_tag;
};
int main(int argc, char **argv) {
  std::cout << std::__has_iterator_typedefs<Iter>::value << std::endl;  // output '0';
  // std::cout << (typeid(std::iterator_traits<Iter>::iterator_category) == typeid(std::random_access_iterator_tag)) << std::endl;
  return 0;
}

iterator_category不是标准库兼容迭代器应该提供的唯一成员类型。 如果您看一下__has_iterator_typedefs是如何实现的,您会发现它还检查这些成员类型的存在: difference_typevalue_typereferencepointer 添加所有这些,然后std::iterator_traits<Iter>::iterator_category将返回您的迭代器的类别。

struct Iter {
  using iterator_category = std::random_access_iterator_tag;
  using value_type        = int;
  using difference_type   = std::ptrdiff_t;
  using reference         = value_type&;
  using pointer           = value_type*;
};

static_assert(std::is_same_v<std::iterator_traits<Iter>::iterator_category, 
                             std::random_access_iterator_tag>);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM