Операторы C++ на ссылочных vars, что это делает?

Я наткнулся на класс с членом var в качестве ссылки (на std::istream), с оператором void * () и оператором bool !() that return that reference, and i’m wondering what that would be for. Класс связан с чтением / анализом текстовых файлов с парами config param. Я вытащил из (гораздо) большего проекта основные части. В qt (MSVC 2015 community tool chain), я должен был изменитьoperator void *(), чтобы получить компиляцию, но кажется в порядке на оригинальной системе linux.

(В моей среде рабочего стола я получаю: «ошибка: C2440: ‘return’: не удается преобразовать из ‘std:: istream’ в ‘ void *'», поэтому я заменил вызов if(m_in.eof())и return nullptr)

class LR { // (line reader)
public:
  LR(const std::string &filename);

  .... other stuff

  operator void *() const { return &m_in; }
  bool operator !() { return !m_in; }
  LR & operator>>(std::string &line);

private:
  std::istream &m_in; // input stream
  std::ifstream m_in_file; // input file (if specified)

}; 
LR::LR(const std::string &filename, ... other stuff) :
   : m_in(m_in_file)
{
   //  .... other stuff
  if(filename.size() > 0)
  {
    m_in_file.open(filename.c_str());
  }
   // .... other stuff
}

и класс, который использует это:

class CR { // config reader
public:
  // .... other stuff
  void Load_Variable(const std::string &section, value, etc...);
private:
  LR m_reader;
};
void CR::Load_Variable(const std::string &section, value, etc.) {
  string line;
  bool found = false;
  while (m_reader >> line)
  {
    // .... check stuff, etc.
  }
}

Отладка в Qt, while (m_reader >> line)вызывает оператор void *().
Мои вопросы:
Зачем использовать ссылку члена var на std::istreamподобное?
Какова цель возврата адреса элемента var&m_in, если он всегда действителен, поскольку он является элементом var (или это не так?)
Будет operator *()ли m_reader когда-нибудь возвращать false? Я немного поискал в интернете и не нашел подобных примеров такого рода использования операторов на членах var refs. Мне нужно посмотреть, что он делает, когда файл не открывается.
Возможно, этот код первоначально использовал vars указателя кучи или какой-то другой подход для m_in var и это было изменено где-то по пути, чтобы быть нормальным членом var, с операторами, затем отредактированными к этому? Я думаю, что историю нелегко получить.
Спасибо за помощь, stackoverflow является удивительным.





Метки

1 ответ

  1. Istream имеет флаг, который указывает, произошла ли ошибка, и он переопределяет ! оператор для легкого доступа. Вы часто увидите, что он используется так:

    myStream >> line;
    if(!myStream)
       cout<<"Error reading data"<<endl;
    

    Таким образом, вы не возвращаете ссылку, вы возвращаете логический флаг. Подумай ! оператор как isNoError()аксессор.

    Ваш класс делает то же самое, просто проходя через результат из потока, который он обертывает.

    Оператор*, вероятно, существует в качестве меры обратной совместимости. Вероятно, существующая база кода ожидает указатель, и это было добавлено, чтобы существующая база кода работала с новой реализацией.