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

jma*_*erx 12 c++ unicode utf-8 character-encoding

既然std::string实际上是typedef模板类,我怎么能覆盖呢?我想制作一个std::string能返回正确长度的UTF-8 .

Fre*_*Foo 19

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

typedef std::basic_string<unsigned char, utf8_traits> utf8string;
Run Code Online (Sandbox Code Playgroud)

另见Herb Sutter的网站.

  • @Matthieu M.,这完全取决于你如何实现角色特征.我可以看到两个选项:直接将它们打包为UTF-8并实现`state_type`,或者将它们打包为UTF-32并在边界处转换.无论哪种方式,这都是很多工作,但它保留了与STL算法的兼容性. (3认同)

Arm*_*yan 16

不要从STRING中获取

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

不要从STRING中获取

  • -1.此任务的最佳实践是提供Character Traits对象并实例化`std :: basic_string`.在这种情况下隐藏`std :: string`会引发`char` signedness问题,因为UTF-8是一个8位多字节编码. (2认同)