Прежде всего - std::string
- беспорядок и слишком много методов, как есть. Плохой дизайн - смешивать функциональность с классом, который не обязательно должен быть в этом классе, и который может быть легко реализован с использованием более простых, более базовых c методов класса - как автономная функция.
Более того - std::string
в то же время громоздко манипулировать (это не строковый буфер или std::stringstream
), и не невозможно манипулировать, то есть не является неизменным.
Но вернемся к моей более ранней точке: «правильный путь» - если он есть - делать то, что вы хотели, - это автономные функции. Например, предположим, что вы хотите случайным образом перестановить содержимое std::string
. Ну, или:
std::string& jumble(std::string& str)
или
std::string jumble(std::string str)
или, может быть, если вы хотите чувствовать себя крутым и оптимизированным микро,
std::string jumble(const std::string& str)
std::string jumble(std::string&& str)
в зависимости от того, хотите ли вы использовать строки чаще как неизменяемые или как изменяемые сущности.
Также помните, что у нас на самом деле нет ни одного std::string
класса - у нас есть шаблон, основанный на типе символов (и allocator et c.), поэтому, если вы хотите быть обобщенным c, вы должны принять этот класс:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
PS - Если у нас был единый синтаксис вызова, как Бьярне предложил - что нам действительно следует ИМХО - ваши автономные функции могут быть просто вызваны, как если бы они были членами:
auto jumbled = my_string.jumble();