演算子を使用して値を読み取る方法>>しかし、値のデフォルトコンストラクタはありませんか?

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

  •  08-07-2019
  •  | 
  •  

質問

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

この汎用コードは、追加のエラー処理を備えたタイプTの値を読み取りました。 それは演算子を持つことに依存しています&gt;&gt; Tを解析できるため、この方法で新しい型に拡張できます。

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

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

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

役に立ちましたか?

解決

入力ストリームからのストリーミングでは、書き込むための完全に構築されたオブジェクトが常に想定されます。オブジェクトを作成する必要はありません。できることは、さまざまな方法を許可することだけです。

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

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

デフォルトで構築できないが、istreamから構築できるタイプ X がある場合、次の専門化が行われます:

template<>
struct istream_traits<X>
{
  inline static X read(std::istream& is)
  {
    return X(is);
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top