Как прочитать значение с помощью оператора > > но нет конструктора по умолчанию для значения?

StackOverflow https://stackoverflow.com/questions/1641114

  •  08-07-2019
  •  | 
  •  

Вопрос

template <class T>
T Read () {
  T t;
  cin >> t;
  if (cin.fail()) {
    // ...
  }
  return t;
}

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

Чего я не понял, так это того, что в T есть конструктор по умолчанию. Теперь я столкнулся с этой проблемой.

Какие у меня есть варианты?

Как правильно это сделать?

Это было полезно?

Решение

Потоковая передача из входного потока всегда предполагает полностью созданный объект для записи. Вы не можете обойтись без необходимости создания объекта, все, что вы можете сделать, - это сделать это разными способами

Одним из способов сделать это могут быть черты. Стандартные черты будут делать то, что вы делаете:

template< typename T >
struct istream_traits
{
  inline static T read(std::istream& is)
  {
    T obj;
    is >> obj;
  }
}

template< typename T >
inline T read(std::istream& is)
{
  is >> std::ws;
  T obj = istream_traits<T>::read(is);
  is >> std::ws;
  if(!is.eof()) throw "dammit!";
  return obj; 
}

Если у вас есть тип X , который не может быть сконструирован по умолчанию, но может быть сконструирован из istream, следующая специализация подойдет:

template<>
struct istream_traits<X>
{
  inline static X read(std::istream& is)
  {
    return X(is);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top