Добавление функций в std :: string в c ++ - PullRequest
0 голосов
/ 05 марта 2020

Мне просто не хватает некоторых функций в классе строк стандартной библиотеки c ++, поэтому я просто хотел добавить их самостоятельно. Я написал это:

#include <string>


class String : public std::string
{
public:
    // some new fancy functions
};

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

I просто хочу нормальную строку, но с дополнительными функциями, написанными мной, как я могу добиться этого правильным способом? Или нет способа сделать это правильно, и я должен исправить свой собственный класс строки?

1 Ответ

2 голосов
/ 05 марта 2020

Прежде всего - 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();
...