streampos
与pos_type
,streamoff
和off_type
之间存在哪些差异,除非它们的定义不同。我应该对basic_stream<>::seek
的函数使用什么?
答案 0 :(得分:11)
std::basic_istream
和std::basic_ostream
都采用两种模板类型CharT
和Traits
。给定从其中一个基本流派生的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 defined,off_type
和pos_type
的预期含义为:
pos_type
用于流off_type
用于相对位置因此,如果要使用seekg()
的绝对版本,则应声明的数据类型为A::pos_type
(与A::traits_type::pos_type
相同)。对于相对版本,它是A::off_type
。
关于std::streampos
和std::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。