【问题标题】:How do I declare a custom char_traits<> for my own type?如何为我自己的类型声明自定义 char_traits<>?
【发布时间】:2014-01-27 21:17:56
【问题描述】:
我想为我自己的类型创建一个自定义的char_traits 类。我已经声明了所有函数,但我对标准中给出的模糊语义有些困惑。
fpos_type、off_type 和 state_type 应该做什么?如果需要的话,它们在哪里需要?
标准规定将traits::eof() 和有效代码点分开,因此要求使用大于char_type 的int_type。但是我可以将我的char_type 设置为有符号数,我知道有效代码点仅在非负范围内。它给我留下了负值作为traits::eof() 的可能值。或者int_type 应该是char_type 的正确超集,这样char_type 就不能取eof() 的值?更重要的是,我可以让int_type 和char_type 相同吗?
【问题讨论】:
标签:
c++
iostream
streambuf
【解决方案1】:
-
std::fpos 是一个封装文件流的文件定位语义的类。它使用当前的转换状态来识别文件位置。 off_type 和 pos_type 是在 std::char_traits 中定义的类型,分别是偏移类型和位置类型。 pos_type 用作 seek 函数的参数,是 tell 函数返回的类型。它是一种表示绝对位置的类型。 off_type 用于查找函数的重载,用于指定与提供的文件位置的偏移量。
state_type 也在std::char_traits 中定义。用于指定多字节序列的转换状态。
您可以在[char.traits.require] 中查找这些类型的所有要求。
-
这是traits::int_type - [char.traits.typedef]的定义
typedef INT_T int_type
对于某个字符容器类型char_type,相关的容器类型INT_T应该是一个类型或类,它可以表示从对应的char_type值转换而来的所有有效字符,以及一个结束符-文件值,eof()。 int_type 类型表示一个字符容器类型,它可以保存文件结尾,用作 iostream 类成员函数的返回类型。
这个定义暗示int_type 只能表示char_type 类型的值,以及eof() 值。除了为 std::char_traits 的某些特化指定别名之外,它没有对类型定义进一步的要求