2013-05-20 4 views
-1

Эта проблема кажется очень распространенной проблемой, но я не могу найти для нее решение. И я почти уверен, что такая функциональность должна быть частью повышения или другой популярной библиотеки.Ограничить длину строки в определенном диапазоне

Я хочу иметь замену для std :: string, для которой я мог бы указать минимальную и максимальную длину, желательно во время компиляции. Возможно, он также может поддерживать состояние без набора строк (в способе boost::optional). Что-то вроде этого:

ranged_string<min, max> str; 

При присвоении недопустимого значения следует выбросить исключение.

Создание такой утилиты не должно быть очень тяжелым (просто некоторые перегрузки и исключения), но я не хочу изобретать велосипед.

+0

Диапазон проверки во время компиляции (с исключениями)? Не могу. * Замена * 'std :: string'? Конечно нет. Обертка была бы правильным способом сделать это. –

+1

Вы должны сделать это сами, потому что ваша потребность не является общей и широко распространенной. Вы хотите проверить минимальную и максимальную длину, я хочу проверить, что все символы являются буквами ... это просто проверка ввода. –

+0

@MarkGarcia: проверка должна выполняться во время выполнения, во время компиляции должны указываться только диапазоны. – user1234567

ответ

0

Возможно, лучше всего расширить (или обернуть) string и перегрузить (или защитить через упаковку) все операции, которые могли бы отвлечь или добавить строку для проверки границ. Мне любопытно, что из того, что будет использовать строка с диапазоном?

Редактировать: это было бы не во время компиляции.

+0

Как бы вы перегрузили 'std :: string' в любом случае? –

+0

Ну, std :: string не предполагается наследовать, но это можно сделать, нет? У него нет виртуального деструктора, который может быть проблемой, хотя ... – SubSevn

+0

Вы всегда можете наследовать 'std :: string', но реальный вопрос - это * should *, который вы наследуете от' std :: string'. Это всегда выбор программистов. Выбор между тем, чтобы сделать его жизнь несчастной или нет. –

-1

Я считаю, что вы можете подключить свой пользовательский allocator с помощью basic_string, который может генерировать исключение, когда он вырастает за пределами диапазона или сжимается ниже диапазона.

typedef std::basic_string<char, std::char_traits<char>, ranged_allocator<char, min, max> > ranged_string; 

ranged_allocator<char, min, max>::allocate(size_type) будет держать увеличение счетчика ranged_allocator<char, min, max>::deallocate(size_type) будет держать декремент счетчика

и оба будут бросать, если счетчик превышает диапазон

+0

Является ли «выделенная память> N» такой же, как «длина строки> N» для всех строк? –

+0

'string length' изменяется как количество' allocate' запросов, как всякий раз, когда он хочет выделить символ, который он называет 'allocate (size_type sz)', поэтому 'counter + = sz' будет держать счетчик обновленным. –

+0

@NeelBasu: Будет ли выделяться для нулевого терминатора также? Поэтому я смогу сказать, нужно ли исключать исключение или нет? – user1234567

Смежные вопросы