연산자와 함께 값을 읽는 방법 >> 그러나 값에 대한 기본 생성자가 없습니까?
-
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);
}
}
제휴하지 않습니다 StackOverflow