Frage

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

Dieses generische Code lesen Wert vom Typ T mit einigen zusätzlichen Fehlerbehandlung. Es stützt sich auf Betreiber mit >> der T analysieren kann, und auf diese Weise ist es für neue Typen erweiterbar.

Was ich nicht erkennen, ist, dass es stützt sich auf T einen Standardkonstruktor haben. Jetzt habe ich in dieses Problem betroffen.

Was sind meine Optionen?

Was ist der richtige Weg, es zu tun?

War es hilfreich?

Lösung

von einem Eingangsstrom Streaming übernimmt immer ein vollständig aufgebaut Objekt in zu schreiben. Sie können mit herumkommen nicht um ein Objekt zu konstruieren, alles, was Sie tun können, ist für verschiedene Arten erlauben, dies zu tun.

Eine Möglichkeit, dies zu tun Züge sein könnte. Die Standard-Züge tun würde, was Sie tun:

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

Wenn Sie einen Typ X haben, die nicht Standard-konstruiert werden können, kann aber von einem istream konstruiert werden, die folgende Spezialisierung tun würde:

template<>
struct istream_traits<X>
{
  inline static X read(std::istream& is)
  {
    return X(is);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top