Потоковая передача из входного потока всегда предполагает полностью построенный объект для записи. Вы не можете обойтись без необходимости создания объекта, все, что вы можете сделать, - это сделать это разными способами.
Одним из способов сделать это могут быть черты. Стандартные черты будут делать то, что вы делаете:
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);
}
}