В чем разница между streampos
и pos_type
, streamoff
и off_type
, за исключением того, что они определены по-разному. Что я должен использовать с функциями basic_stream<>::seek
?
Каковы различия между streampos и pos_type, streamoff и off_type?
Ответ 1
std::basic_istream
и std::basic_ostream
оба берут два типа шаблона, CharT
и Traits
. Учитывая класс A, который получен из одного из базовых потоков, тип данных Traits
может быть получен как
A::traits_type
В соответствии с §21.2 стандарта С++ этот тип данных должен содержать следующие типы членов:
char_type // must be identical to CharT of the basic-stream
off_type
pos_type
(и некоторые другие типы данных, не относящиеся к данному вопросу). Учитывая способ std::basic_istream<>::seekg()
метод, предполагаемый смысл 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
на самом деле будет std::streamoff
.
Если вы создаете свою собственную версию Traits
и хотите использовать ее со стандартными библиотечными шаблонами, такими как std::basic_istream<>
и т.д., вы должны включить typedefs для pos_type
и off_type
(и множество других типов данных) и обеспечить их соответствие требованиям § 27.2.2 и § 27.3 стандарта.