Есть предложения добавить string_view в C++ в будущем стандарте.
string_view — это итерируемый диапазон символов без владения со многими утилитами и свойствами, которые вы ожидаете от строкового класса, за исключением того, что вы не можете вставлять/удалять символы (и редактирование символов часто блокируется в некоторых подтипах).
Я бы посоветовал попробовать этот подход - написать свой собственный (в своем собственном пространстве имен утилит). (В любом случае у вас должно быть собственное пространство имен утилит для повторно используемых фрагментов кода).
Данные ядра представляют собой пару char* pr std::string::iterators (или const версий). Если пользователю нужен буфер с нулевым завершением, метод to_string выделяет его. Я бы начал с неизменяемых (const) символьных данных. Не забывайте begin и end: это делает ваше представление итерируемым с for(:) циклами.
У этого дизайна есть опасность, что исходный std::string должен сохраняться достаточно долго, чтобы пережить все представления.
Если вы готовы пожертвовать некоторой производительностью ради безопасности, создайте представление, владеющее std::shared_ptr<const std::string>, в которое оно может переместить std::string, и в качестве первого шага переместите в него весь буфер, а затем начните разбивать/разбирать его. (дочерние представления создают новый общий указатель на те же данные). Тогда ваш класс представления больше похож на неизменяемую строку с общим хранилищем.
К преимуществам версии shared_ptr<const> относятся безопасность, более длительное время жизни представлений (больше нет зависимости от времени жизни), и вы можете легко перенаправить свои методы типа "подстрока" const в std::string, чтобы писать меньше кода.
К недостаткам можно отнести возможную несовместимость с поступающим стандартным1 и более низкую производительность из-за перетаскивания shared_ptr.
Я подозреваю, что представления и диапазоны будут играть все более важную роль в современном C++ с предстоящими и недавними улучшениями языка.
boost::string_ref, по-видимому, является реализацией предложение к стандарту C++1y.
1 однако, учитывая простоту добавления возможностей в метапрограммирование шаблонов, использование аргумента шаблона "владелец ресурса" для типа представления может быть хорошим дизайнерским решением. Тогда у вас могут быть владеющие и не владеющие string_view с одинаковой семантикой...
person
Yakk - Adam Nevraumont
schedule
15.07.2014
string_view. - person Casey   schedule 15.07.2014