C ++; отразить и пройти через std :: basic_istream <>? - PullRequest
1 голос
/ 15 июня 2019

GIVEN :

Класс MyStream, производный от std::basic_istream<>, содержит указатель subject на std::basic_istream<> объект.Он должен ответить на tellg() и read() с измененным содержанием из соответствующих ответов subject.

template <class T> MyStream :
   public std::basic_istream<typename T::char_type, typename T::traits_type> {

   std::basic::istream<...>*   subject;

   ...
};

ПРОБЛЕМА : Функции tellg(), seekg() и read(), а также функции флагов состояния не являются виртуальными.

ВОПРОС : Как MyStream объект может передавать, искать и читать субъекту, пересылать ответ вызывающей стороне и изменять флаги состояния так, чтобы они соответствовали флагам subject?

1 Ответ

1 голос
/ 15 июня 2019

Используйте что-то вроде этого:

template <typename T> struct MyStream : public std::basic_istream<typename T::char_type, typename T::traits_type> {
   struct rdbuf_impl : public std::basic_streambuf<typename T::char_type, typename T::traits_type> {
       // overwrite what you need
       std::basic::istream<...>* subject;

       // for tellg passthru (an example)
       pos_type seekoff( off_type off, std::ios_base::seekdir dir,
                      std::ios_base::openmode which = ios_base::in | ios_base::out ) overwrite {
           return subject->pubseekoff(off, dir, which);
       }
   };
   MyStream(std::basic::istream<...>* subject) {
       auto v = new rdbuf_impl(subject);
       rdbuf(v); // set associated stream buffer 'v' in 'this'.
   }
};

РЕДАКТИРОВАТЬ: Давайте рассмотрим метод tellg.Глядя на определение класса basic_istream::tellg (https://en.cppreference.com/w/cpp/io/basic_istream/tellg) - написано, что tellg вызовет rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::in). Документация для basic_streambuf::pubseekof (https://en.cppreference.com/w/cpp/io/basic_streambuf/pubseekoff) упоминает, что он вызовет seekoff(off, dir, which). seekoff является виртуальным в basic_streambuf классе, и вы можете перезаписать его.

...