继承和覆盖std :: string的函数?

时间:2010-11-17 13:55:18

标签: c++ unicode utf-8 character-encoding

由于std::string实际上是模板类的typedef,我该如何覆盖它?我想制作一个UTF-8 std::string,它将返回正确的长度等等。

8 个答案:

答案 0 :(得分:19)

如果你必须定义你自己的字符串类型,那么不要从std::string继承,而是定义你自己的Character Traits类并做类似的事情

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

另见Herb Sutter's website

答案 1 :(得分:16)

不要从STRING中获取

std :: string,也就是说,基本上整个basic_string模板并非设计为派生自。已经有数以万计的文章。它没有任何虚函数,因此无法覆盖。你能做的最好的就是隐藏一些东西。最好是使用合成/聚合!也就是说,只需在类中保留类型字符串的成员并转发调用!再次,只是为了确保

不要从STRING中获取

答案 2 :(得分:4)

一般认为从C ++中导出标准库容器是一个错误。但是,您正在寻找的功能已经实现。看看Glib::ustring

希望这有帮助!

答案 3 :(得分:1)

  1. 你看过ICU了吗?

  2. typedef只是一个方便的标签。

    class foo:public bar {};

  3. 当bar是PT的typedef时,

    可以正常工作。

    在这种情况下,这可能不是一个好主意,但语言支持它。

答案 4 :(得分:1)

请务必先知道自己在做什么。您希望从字符串对象返回的“正确长度”是什么?代码点数量?这并不总是与用户所感知的字符数相对应。

无论如何,看看utf8-cpp库,看看从std :: string派生的另一种方法。

答案 5 :(得分:0)

更好的想法:创建一个兼容STL的utf8_string容器,而不继承std :: string。

答案 6 :(得分:0)

编写符合并在每种情况下都能正常工作的unicode实现非常困难。我建议你使用现有的库或实现,而不是自己动手。例如,Windows,OSX和Qt都有支持UTF-16和其他编码字符串的库。

答案 7 :(得分:-1)

正如其他人已经说过的那样:不要来自std::string,它不是为此设计的。

您应该查看this article,其中显示了如何创建不区分大小写的字符串类作为示例。您将看到std::basic_string中实现的逻辑与字符类型无关,并且提供一些自定义char_traits应该可以解决问题。