如何使用运算符>>读取值但没有默认构造函数的值?
-
08-07-2019 - |
题
template <class T>
T Read () {
T t;
cin >> t;
if (cin.fail()) {
// ...
}
return t;
}
此通用代码读取类型为T的值,并带有一些额外的错误处理。 它依赖于运营商&gt;&gt;可以解析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