Подтвердить что ты не робот

Существует ли стандартный Cyclic Integer Class в С++?

У меня есть проблема, которая довольно распространена в коде, который я пишу в тот момент, когда я хочу иметь целое число, которое может существовать только внутри определенного диапазона, где диапазон [начало, конец]. В основном я хочу иметь возможность сделать что-то вроде следующего:

cyclic_int ci(4, 8);

ci = 4;
assert(ci == 4);
ci += 3;
assert(ci == 7);
ci += 2;
assert(ci == 5);
assert(ci == 13);

И это должно все вернуть true. В принципе класс автоматически применяет модуль (%) для меня, а целое число действует как циклическое целое число в диапазоне, в котором я его инициализирую. Я мог бы реализовать этот класс сам и перегрузить все общие операторы, чтобы он работал хорошо с нормальными целыми числами, но он кажется полезным классом, который кто-то мог сделать раньше.

Итак, мой вопрос заключается в том, есть ли такой класс, как этот, где-то там, где все используют, или я думаю о том, чтобы делать это неправильно, и есть ли более простой способ. (Моя цель - не постоянно думать о применении оператора% или какой-либо подобной функции над ним). Спасибо.

Изменить: я решил написать свой собственный, а просто для удовольствия: http://github.com/robertmassaioli/wrapping_number

4b9b3361

Ответ 1

Я никогда не использовал его, и он еще не является официальной библиотекой Boost, но Boost.ConstrainedValue имеет wrapping_int, который очень похож на что вы ищете.

Несмотря на то, что он еще не является частью Boost, он был рассмотрен и, в последнее время, был принят второй вариант: http://lists.boost.org/boost-announce/2010/09/0265.php

Библиотека доступна по адресу http://rk.dl.pl/f/constrained_value.zip

Документация находится на http://rk.dl.pl/r/constrained_value

Ответ 2

Не проще ли использовать функцию 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); 

Ответ 3

Это может быть не совсем то, что вы хотите, но вас может заинтересовать одна из многих библиотек поля Галуа (http://www.google.co.uk/search?q=galois+field+c%2B%2B+library). Я никогда не использовал ни одного из них, поэтому я не могу дать конкретную рекомендацию.