2010-09-28 10 views
11

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

+1

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. –

+1

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 –

+0

@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? –

risposta

2

Non l'ho mai usato e non è ancora una libreria Boost ufficiale, ma Boost.ConstrainedValue ha uno wrapping_int che sembra molto simile a quello che stai cercando.

Anche se non è ancora una parte di spinta, è stato esaminato e, IIUC, condizionalmente accettato di recente: http://lists.boost.org/boost-announce/2010/09/0265.php

La biblioteca è disponibile presso http://rk.dl.pl/f/constrained_value.zip

La documentazione è a http://rk.dl.pl/r/constrained_value

+0

Ho scritto anche il mio solo per puro divertimento: http://github.com/robertmassaioli/wrapping_number –

4

non è più facile da usare la funzione normalize?

int normalize(int val, int start, int end) 
{ 
    return (val - start) % (end - start) + start; 
} 


int ci = 4; 
assert(ci == 4); 
ci = normalize(ci + 3, 4, 8); 
assert(ci == 7); 
ci = normalize(ci + 2, 4, 8); 
assert(ci == 5); 
assert(ci == 13); 
+1

Questo era esattamente quello che stavo cercando di evitare perché non voglio dover pensare veramente ad applicare la funzione di normalizzazione (perché alla fine mi dimenticherò). E l'ultima affermazione fallirà anche io penso? –

+0

In realtà, penso che l'ultima affermazione dovrebbe fallire, perché 13 non è definito come un numero a gamma limitata, vorrei usare assert (ci == cyclic_int <4,8> (13)); (modello è conveniente qui) – stefaanv

+0

@stefaanv: Penso che quello che sta ottenendo è che 13 dovrebbe essere congruente a 5 nel cyclic_int (4, 8) (ad esempio include numeri interi 4, 5, ...12), che è. Sono d'accordo con la nozione di un modello ... fornisce una digitazione più forte. – andand

Problemi correlati