Подтвердить что ты не робот

Наследование и переопределение функций std::string?

Так как std::string на самом деле является typedef шаблонизированного класса, как я могу его переопределить? Я хочу сделать UTF-8 std::string, который вернет правильную длину, между прочим.

4b9b3361

Ответ 1

НЕ ОТВЕРГАЙТЕ ОТ STRING

std::string, то есть в основном весь шаблон basic_string не предназначен для вывода. Об этом уже есть дваллион статей. У него нет виртуальных функций, поэтому переопределить нечего. Лучшее, что вы можете сделать, это скрыть что-то. Лучше всего использовать состав/агрегацию! То есть просто держите член строки типа в своем классе и пересылайте вызовы! Опять же, чтобы убедиться, что

НЕ ОТВЕРГАЙТЕ ОТ STRING

Ответ 2

Если вы должны определить свой собственный тип строки, то не наследуйте от std::string, а определите свой собственный класс Character Traits и сделайте что-нибудь как

typedef std::basic_string<unsigned char, utf8_traits> utf8string;

См. также веб-сайт Herb Sutter.

Ответ 3

Обычно считается, что ошибка в С++ происходит из стандартного контейнера библиотеки. Однако функциональность, которую вы ищете, уже реализована. Посмотрите Glib:: ustring.

Надеюсь, это поможет!

Ответ 4

  • Вы посмотрели на ICU?

  • typedef - это просто удобная метка.

    класс foo: public bar {};

отлично работает, когда bar является typedef PT.

В этом случае это может быть не очень хорошо, но язык поддерживает его.

Ответ 5

Просто убедитесь, что вы знаете, что вы делаете в первую очередь. Что такое "правильная длина", которую вы хотите вернуть из ваших строковых объектов? Количество кодовых точек? Это не всегда соответствует количеству символов, воспринимаемых пользователем.

В любом случае, просмотрите библиотеку utf8-cpp, чтобы увидеть альтернативный подход к выводу из std::string.

Ответ 6

Лучшая идея: создать STL-совместимый контейнер utf8_string без наследования от std::string.

Ответ 7

Написание реализации юникода, которая соответствует и работает должным образом при любых обстоятельствах, очень сложно сделать. Я бы посоветовал вам использовать существующую библиотеку или реализацию вместо того, чтобы сворачивать свои собственные. Например, Windows, OSX и Qt имеют библиотеки, которые поддерживают UTF-16 и другие закодированные строки.

Ответ 8

Как уже было сказано другими: не вытекает из std::string, он просто не предназначен для этого.

Вам следует взглянуть на в этой статье, в котором показано, как создать примерный класс строк, нечувствительный к регистру. Вы увидите, что логика, реализованная в std::basic_string, не зависит от типа символа, и что предоставление некоторого пользовательского char_traits должно сделать трюк.