template <class T>
T Read () {
T t;
cin >> t;
if (cin.fail()) {
// ...
}
return t;
}
这个通用代码读取类型 T 的值,并进行了一些额外的错误处理。它依赖于具有可以解析 T 的 operator>>,并且通过这种方式它可以扩展到新类型。
我没有意识到它依赖于 T 具有默认构造函数。现在我遇到了这个问题。
我有哪些选择?
正确的方法是什么?
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);
}
}