我想设计一个返回包装器的迭代器,如下所示:
VarArgReference operator*() const
{
return VarArgReference(state_, stack_index_);
}
VarArgReference operator->() const
{
return VarArgReference(state_, stack_index_);
}
现在我想定义迭代器特征,例如来自std::iterator
。我所知道的:这是一个InputIterator(只读对象)。但我希望它也支持随机访问功能。
所以一步一步:对于InputIterator,我需要*i
返回“reference,convertible to value_type”。所以我可以简单地设置reference = value_type = VarArgReference。
下一步是前进迭代器。但是http://en.cppreference.com/w/cpp/concept/ForwardIterator说“std :: iterator_traits :: reference必须完全是[...] const T& [for OutputIterator](它是常量),(其中T是由std :: iterator_traits ::表示的类型) VALUE_TYPE)“
那会是什么?我的reference
现在真的const VarArgReference&
了吗?这意味着我需要返回那种类型,一个const&到一个右值。什么时候使用pointer
?我需要将其设为const VarArgReference*
还是VarArgReference
。
其他问题:ForwardIterator必须默认可构造。这意味着我需要用某些东西初始化状态(无效?)并且可能在取消引用时检查并捕获它。或者它只是未定义的行为,我可以省略检查?
注意:如果这很重要,C ++ 98和C ++ 11需要使用它
注意2:在C ++ 17中不推荐使用std::iterator
,这建议明确定义嵌套的typedef(请参阅注释)。因此,从std::iterator
派生只有可能性来定义那些,但不应该使用它们。