Cómo leer un valor con el operador > > pero no hay un constructor predeterminado para el valor?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

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

Este valor de lectura de código genérico de tipo T con algún tratamiento adicional de errores. Se basa en tener el operador > > que puede analizar T, y de esta manera es extensible a nuevos tipos.

Lo que no me di cuenta es que depende de que T tenga un constructor predeterminado. Ahora me he encontrado con este problema.

¿Cuáles son mis opciones?

¿Cuál es la forma correcta de hacerlo?

¿Fue útil?

Solución

La transmisión desde una transmisión de entrada siempre supone un objeto totalmente construido para escribir. No puede evitar tener que construir un objeto, todo lo que puede hacer es permitir diferentes formas de hacerlo.

Una forma de hacerlo podría ser rasgos. Los rasgos estándar harían lo que estás haciendo:

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; 
}

Si tiene un tipo X que no puede construirse por defecto, pero puede construirse desde un istream, la siguiente especialización sería:

template<>
struct istream_traits<X>
{
  inline static X read(std::istream& is)
  {
    return X(is);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top