Bonjour, Dans le cadre de programmation par contrat, je cherche à pouvoir vérifier qu'un itérateur précède un autre. J'illustre ma question avec l'exemple suivant, une boucle dont l'utilisateur me fournit le début et la fin :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * \brief Loop * \attention T must implement operator++() and operator!=(const T&) * \param begin Begin of the loop * \param end End of the loop * \pre begin precedes end */ template <typename T> void loop(const T& begin, const T& end) { T run = begin; while(run != end) { /* do something with run */ ++run; } } loop(0,10); std::set<double> x; x.insert(1.0); x.insert(2.0); x.insert(3.0); loop(x.begin(), x.end()); |
J'aimerais pouvoir vérifier ma précondition dans un assert. Fondamentalement, ça signifie que si j'applique l'opérateur ++ un nombre suffisant de fois sur begin, j'arrive à end. Dans le cas où l'utilisateur me fournit de mauvais itérateurs, j'ai une boucle infinie. Est-ce détectable d'une façon ou d'une autre, sans justement se retrouver dans une boucle infinie ?
Merci d'avance.
+0
-0