Ho un problema che è abbastanza comune nel codice che sto scrivendo nel momento in cui voglio avere un numero intero che può esistere solo all'interno di un certo intervallo in cui l'intervallo è [inizio, fine). Fondamentalmente voglio essere in grado di fare qualcosa di simile al seguente:Esiste una classe intera ciclica standard in C++?
cyclic_int ci(4, 8);
ci = 4;
assert(ci == 4);
ci += 3;
assert(ci == 7);
ci += 2;
assert(ci == 5);
assert(ci == 13);
E che tutto dovrebbe tornare vero. Fondamentalmente la classe applica automaticamente il modulo (%) per me e il numero intero agisce come un intero ciclico nell'intervallo con cui lo inizio. Potrei implementare questa classe da solo e sovraccaricare tutti gli operatori comuni per farlo funzionare bene con i normali numeri interi, ma sembra una classe utile che qualcuno potrebbe aver fatto prima.
Quindi la mia domanda è questa, c'è una classe comune come quella là fuori da qualche parte che tutti usano o sto pensando di farlo nel modo sbagliato e c'è un modo più semplice. (Il mio obiettivo è di non dover pensare costantemente all'applicazione dell'operatore% o di una funzione simile su di esso) Grazie.
Edit: ho deciso di scrivere il mio uno pure solo per divertimento: http://github.com/robertmassaioli/wrapping_number
Per quanto come so che non esiste uno "standard di settore" per questo genere di cose - come una libreria Boost, se è questo che intendi. Ma come hai detto, dovrebbe essere abbastanza facile implementare una classe del genere e sovraccaricare tutti gli operatori necessari. –
Usare un commento invece di una risposta perché 1) Non l'ho mai usato e 2) Non è ancora una libreria Boost ufficiale ma: Boost.ConstrainedValue ha un "wrapping_int" che sembra molto simile a quello che stai cercando: http: //student.agh.edu.pl/~kawulak/constrained_value/constrained_value/tutorial.html#constrained_value.tutorial.other_error_policies_for_bounded_objects –
@Eric: Questo è esattamente ciò che stavo cercando ma non è ancora a parte le librerie di boost. Ho provato a guardarmi intorno e non sono riuscito a trovare un'implementazione di riferimento. Continuerò a cercare, ma sai dove si trova? –