如何使用操作符>>但是没有默认构造函数来读取值?

问题描述:

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); 
    } 
} 
+0

“is >> obj;”在阅读和阅读后进行两次。 – 2009-10-29 01:45:25

+0

我想“istream_traits :: read(is);”应该是“istream_policy :: read(is);” – 2009-10-29 01:45:57

+0

我可以做一个大规模的专业化,即不是每个类型分开,但像“如果没有默认构造函数尝试X(istream&),如果这也失败了,尝试命名构造函数:XX :: OfStream(istream&); ? – 2009-10-29 02:09:37