Disons que j'ai un itérateur d'entrée de type MyInputIter
(que j'utilise pour parcourir une structure arborescente) qui satisfait à la condition std::input_iterator
concept.
Y-a-t-il des raisons pour lesquelles je ne devrais pas définir begin()
et end()
sur l'itérateur lui-même ?
struct MyInputIter
{
// iterator stuff omitted
auto begin() const { return *this; }
auto end() const { return MySentinel{}; }
};
La raison étant que je n'ai pas besoin de créer un autre type juste pour envelopper begin
et end
pour que je puisse l'utiliser dans une boucle for :
MyInputIter iterate(TreeNode root, FilterPattern pattern)
{
return MyInputIter{ root, pattern };
}
void foo()
{
for (auto item : iterate(someRandomTreeNode, "*/*.bla"))
process(item);
}
tout en étant capable de l'utiliser comme un itérateur :
std::vector<TreeNode> vec(iterate(someRandomTreeNode, "*"), MySentinel{});