Так как std::string
на самом деле является typedef
шаблонизированного класса, как я могу его переопределить? Я хочу сделать UTF-8 std::string
, который вернет правильную длину, между прочим.
Наследование и переопределение функций std::string?
Ответ 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
должно сделать трюк.