template <class T>
T Read () {
T t;
cin >> t;
if (cin.fail()) {
// ...
}
return t;
}
此通用代码通过一些额外的错误处理读取类型 T 的值。 它依赖于可以解析 T 的 operator>>,这样它就可以扩展到新的类型。
我没有意识到它依赖于具有默认构造函数的 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);
}
}
关于c++ - 如何使用 operator>> 读取值但没有默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641114/