[英]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_type
、 value_type
、 reference
和pointer
。 添加所有这些,然后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.