9

streampospos_typestreamoff和之间有什么区别off_type,除了它们的定义不同。我应该使用basic_stream<>::seek's 函数做什么?

4

1 回答 1

13

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

(以及与当前问题无关的一些其他数据类型)。给定方法std::basic_istream<>::seekg()的定义off_type方式, and的预期含义pos_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::streamposA::off_type并且实际上std::streamoff

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

于 2012-04-13T04:44:32.703 回答