Строковое представление действительно могло быть пустым, или это могло быть представление за пределами контейнера. Предлагаемая вами перегрузка erase
, а также реализация функции в вашем ответе зависит от предварительного условия, что строковое представление относится к одному и тому же строковому объекту.
Конечно, перегрузок итератора очень много аналогичны и полагаются на то же предварительное условие. Но такое предварительное условие является обычным для итераторов, но нетипичным для строковых представлений.
Я не думаю, что строковое представление является идеальным способом представления поддиапазона в этом случае. Вместо этого я бы предложил использовать относительный поддиапазон на основе индексов. Например:
struct sub_range {
size_t begin;
size_t count;
constexpr size_t past_end() noexcept {
return begin + count;
}
};
Вопрос вкуса, использовать ли end
(т.е. past_end
) или count
для второго члена, а другой предоставлять как функцию. Тем не менее, не должно быть путаницы, потому что у участника будет имя. Использование count несколько более стандартно с индексами.
Другой выбор - использовать ли индексы со знаком или без знака. Индексы со знаком могут использоваться для представления обратных диапазонов. Однако интерфейс std::string
не поддерживает такие диапазоны.
Пример использования:
auto gimme_gimme_gimme(const std::string& str) -> sub_range;
auto after_midnight(std::string& str)
{
auto man = gimme_gimme_gimme(str);
str.erase(man.begin, man.distance);
}