Нормальный API для строк

mezastel
mezastel

Допустим вы хотите ввести строку в нижний реестр и побить на токены.

Работать это должно вот так

string s;
string lower = s.to_lower_copy(); // in std::string
vector<string> parts = s.split(' ');

В плане набора API можно и нужно брать C# или Java. 

12
рейтинг
4 комментария
yndx-antoshkka
Если вы предлагаете именно расширять класс std::string новыми методами, то гарантирую что комитету не понравится идея добавить зависимость на std::locale в std::string.

В данный момент сделать нечто подобное можно будет следующим образом:
* дождаться Unified call syntax
* добавить множество методов для работы со строками
* Unified call syntax (я на это очень надеюсь) сделает всё остальное, позволит вызывать s.to_lower_copy()
yndx-antoshkka
Victor Dyachenko
Копировать Java, С# или ещё что-то - плохая идея, как мне кажется. Функции для работы со строками, безусловно, нужны. Но это должны быть свободные функции. Сейчас в стандартном C++ есть минимум 3 представления для строк:

1) const char * + '\0'
2) std::string
3) std::string_view

И ещё куча в сторонних библиотеках: ustring, CString, QString и т.п.

Свободные функции позволят реализовать один интерфейс для них для всех. При таком подходе, замена одного типа на другой должна происходить абсолютно прозрачно для такого кода.
Victor Dyachenko
Ivan Komissarov
Victor Dyachenko, посмотрел в код QString (у которых юникод). Судя по всему, toLower()/toUpper() может менять размер строки (когда lowered/uppered символ становится/перестаёт быть суррогатной парой). Получается, что для uft-8 const char* нельзя сделать inplace to_lower. Тут можно было бы возразить, что это работа локали, но, согласно, доке QString::toLower работает в С локали (в отличие от QLocale::toLower).
С другой стороны, можно интерпретировать строку как latin1, как делает QByteArray::toLower (т.е. тупо игнорируя все символы с кодом > 127). Не уверен, однако, что это универсальное решение, подходящее для стандарта.
Ivan Komissarov
Anatoly Scheglov
Нет. Не нужно брать API C# или Java. Почитайте boost/algorithm/string.
Anatoly Scheglov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).