由于std::string
实际上是模板类的typedef
,我该如何覆盖它?我想制作一个UTF-8 std::string
,它将返回正确的长度等等。
答案 0 :(得分:19)
如果你必须定义你自己的字符串类型,那么不要从std::string
继承,而是定义你自己的Character Traits类并做类似的事情
typedef std::basic_string<unsigned char, utf8_traits> utf8string;
答案 1 :(得分:16)
不要从STRING中获取
std :: string,也就是说,基本上整个basic_string模板并非设计为派生自。已经有数以万计的文章。它没有任何虚函数,因此无法覆盖。你能做的最好的就是隐藏一些东西。最好是使用合成/聚合!也就是说,只需在类中保留类型字符串的成员并转发调用!再次,只是为了确保
不要从STRING中获取
答案 2 :(得分:4)
一般认为从C ++中导出标准库容器是一个错误。但是,您正在寻找的功能已经实现。看看Glib::ustring。
希望这有帮助!
答案 3 :(得分:1)
你看过ICU了吗?
typedef只是一个方便的标签。
class foo:public bar {};
可以正常工作。
在这种情况下,这可能不是一个好主意,但语言支持它。
答案 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
应该可以解决问题。