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

この汎用コードは、追加のエラー処理を使用して T 型の値を読み取ります。T を解析できる operator>> を持つことに依存しており、このようにして新しい型に拡張できます。

私が気付いていなかったのは、デフォルトのコンストラクターを持つ T に依存していることです。今、私はこの問題にぶつかりました。

私のオプションは何ですか?

それを行う正しい方法は何ですか?

4

1 に答える 1

5

入力ストリームからのストリーミングでは、書き込み先として完全に構築されたオブジェクトが常に想定されます。オブジェクトを構築しなければならないことを回避することはできません。できることは、それを行うためのさまざまな方法を許可することだけです。

これを行う 1 つの方法は、trait である可能性があります。標準的な特性は、あなたがしていることを行います:

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);
  }
}
于 2009-10-29T01:27:13.220 に答える