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);
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top