如何使用操作符>>但是没有默认构造函数来读取值?
问题描述:
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);
}
}
“is >> obj;”在阅读和阅读后进行两次。 – 2009-10-29 01:45:25
我想“istream_traits :: read(is);”应该是“istream_policy :: read(is);” –
2009-10-29 01:45:57
我可以做一个大规模的专业化,即不是每个类型分开,但像“如果没有默认构造函数尝试X(istream&),如果这也失败了,尝试命名构造函数:XX :: OfStream(istream&); ? – 2009-10-29 02:09:37