Включение классов для использования с 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;
}

На основедокумент,

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);

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

2> Source is OutputStreamable

3> Цель - InputStreamable

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос