연산자와 함께 값을 읽는 방법 >> 그러나 값에 대한 기본 생성자가 없습니까?

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