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