3
template <class T>
T Read () {
  T t;
  cin >> t;
  if (cin.fail()) {
    // ...
  }
  return t;
}

这个通用代码读取类型 T 的值,并进行了一些额外的错误处理。它依赖于具有可以解析 T 的 operator>>,并且通过这种方式它可以扩展到新类型。

我没有意识到它依赖于 T 具有默认构造函数。现在我遇到了这个问题。

我有哪些选择?

正确的方法是什么?

4

1 回答 1

5

来自输入流的流式传输始终假定要写入一个完全构造的对象。你无法绕过必须构造一个对象,你所能做的就是允许不同的方式来做到这一点。

做到这一点的一种方法可能是特征。标准特征会做你正在做的事情:

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);
  }
}
于 2009-10-29T01:27:13.220 回答