c++ - 如何使用 operator>> 读取值但没有默认构造函数?

标签 c++ stream default-constructor

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/

相关文章:

c++ - 如何在 QTableWidget 中通过 CTRL+click 禁用多项选择?

c++ - 无法在 xcode ios 项目中声明 C++ vector

C++ 流运算符 << 和操纵器/格式化程序

c++ - 如何在 C++ 中对二进制数据使用 >> 和 << 运算符?

c++ - 如何将 s.st_dev 转换为/sys/block/<name>

java - Android 蓝牙打印未按预期工作

c# - 为什么 String 类没有无参数构造函数?

c++ - 是否存在删除了 ctor 的类有用的情况?

c# - 如何从无参数构造函数调用带有 2 个参数的构造函数?

c++ - 如何使用 eax 和 esi 中的参数调用函数。海湾合作委员会