Наследование и переопределение функций std :: string? - PullRequest
12 голосов
/ 17 ноября 2010

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

Ответы [ 8 ]

19 голосов
/ 17 ноября 2010

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

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

См. Также Сайт Херба Саттера .

16 голосов
/ 17 ноября 2010

НЕ ПРОИЗВОДИТСЯ ОТ STRING

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

НЕ ПРОИЗВОДИТСЯ ОТ STRING

4 голосов
/ 17 ноября 2010

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

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

1 голос
/ 17 ноября 2010

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

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

1 голос
/ 17 ноября 2010
  1. Вы смотрели на ICU?

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

    class foo: public bar {};

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

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

0 голосов
/ 17 ноября 2010

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

0 голосов
/ 17 ноября 2010

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

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

0 голосов
/ 17 ноября 2010

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

...