В чем разница между 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 стандарта.