Enabling Classes for Use with boost::lexical_cast

Фрагмент кода из lexical_cast:

class lexical_castable {
public:
  lexical_castable() {};
  lexical_castable(const std::string s) : s_(s) {};

  friend std::ostream operator<<
    (std::ostream& o, const lexical_castable& le);
  friend std::istream operator>>
    (std::istream& i, lexical_castable& le);

private:
  virtual void print_(std::ostream& o) const {
    o << s_ <<"\n";
  }

  virtual void read_(std::istream& i) const {
    i >> s_;
  }

  std::string s_;
};

std::ostream operator<<(std::ostream& o,
  const lexical_castable& le) {
  le.print_(o);
  return o;
}

std::istream operator>>(std::istream& i, lexical_castable& le) {
  le.read_(i);
  return i;
}

Основано на document,

template
  Target lexical_cast(const Source& arg);

1> Возвращает результат потоковой передачи arg в стандартный библиотечный поток на основе строк, а затем выводит его как объект Target.

2> Source is OutputStreamable

3> Target is InputStreamable

Вопрос1> Для типов, определяемых пользователем (UDT), всегда ли OutputStreamable или InputStreamable должны иметь дело с std::string? Например, в классе, содержащем простое целое число в качестве переменной-члена, когда мы определяем operator и operator>>, как выглядит код реализации? Должен ли я преобразовывать целое число в строку? Исходя из моего понимания, кажется, что UDT всегда должен иметь дело с std::string, чтобы работать с boost::lexical_cast, а boost::lexcial_cast нуждается в промежуточном std::string для выполнения реальной работы по преобразованию.

Вопрос2> Почему возвращаемое значение operator или operator>> в приведенном выше коде не является ссылкой на std::ostream& или std::istream& соответственно?

8
задан Xeo 25 December 2011 в 16:45
поделиться