streampos和pos_type,streamoff和off_type之间有什么区别?

时间:2012-04-13 00:22:37

标签: c++

streampospos_typestreamoffoff_type之间存在哪些差异,除非它们的定义不同。我应该对basic_stream<>::seek的函数使用什么?

1 个答案:

答案 0 :(得分:11)

std::basic_istreamstd::basic_ostream都采用两种模板类型CharTTraits。给定从其中一个基本流派生的A类,Traits数据类型可以检索为

A::traits_type

根据C ++标准的第21.2节,此数据类型必须提供以下成员类型:

char_type // must be identical to CharT of the basic-stream
off_type
pos_type

(以及与当前问题无关的一些其他数据类型)。鉴于way the std::basic_istream<>::seekg() method is definedoff_typepos_type的预期含义为:

  • pos_type用于流
  • 中的绝对位置
  • off_type用于相对位置

因此,如果要使用seekg()的绝对版本,则应声明的数据类型为A::pos_type(与A::traits_type::pos_type相同)。对于相对版本,它是A::off_type

关于std::streamposstd::streamoff这些也是由标准定义为用于默认版本的数据类型traits_type的。{换句话说,如果您没有明确指定Traits模板参数,A::pos_type 实际上std::streampos,而A::off_type将< em>实际上std::streamoff

如果您创建自己的Traits 版本,并希望将其与std::basic_istream<>等标准库模板一起使用,则必须包含pos_type的typedef和off_type(以及许多其他数据类型),并确保它们符合标准的§27.2.2和§27.3。