Каковы различия между streampos и pos_type, streamoff и off_type?

В чем разница между streampos и pos_type, streamoff и off_type, за исключением того, что они определены по-разному. Что я должен использовать с функциями basic_stream<>::seek?

Ответ 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 стандарта.