【问题标题】:Extract from an ifstream without a temporary variable?从没有临时变量的 ifstream 中提取?
【发布时间】:2018-09-09 19:02:31
【问题描述】:

ifstream 提供operator>> 的重载以从流的下一行提取值。但是,我往往会发现自己经常这样做:

int index;
input >> index;
arr[index] = <something>;

有没有什么方法可以让这些数据进入[index] 而无需创建这个临时变量?

【问题讨论】:

  • 深入了解arr&lt;something&gt;。但最终,我倾向于没有简单的解决方案。
  • @StoryTeller arr 是一个简单的vector&lt;T&gt;,与arrindex 无关
  • 即使您将数据放入[index] 而不创建显式本地(临时)变量,您仍然会获得一个未命名的临时变量。编译器能够很好地优化显式局部变量。我宁愿明确而不是狡猾,但这就是我。
  • 由于输入通常会失败,因此有必要验证读取尝试是否成功。该接口是故意使测试惯用的方式:if (in &gt;&gt; value) { /* use value */ }。此外,评估顺序是未定义的,像 array[read&lt;int&gt;(in)] = read&lt;T&gt;(in); 这样的东西肯定会做错事(你的 &lt;something&gt; 最好是读取同一个流)。

标签: c++ stream operator-overloading ifstream syntactic-sugar


【解决方案1】:

您可以编写一个函数来从istream 中提取下一个值:

template <typename T> // T must be DefaultConstructible
T read(std::istream& input) {
    T result;
    input >> result;
    return result;
}

那么,你可以写:

arr[read<int>(input)] = <something>;

虽然你应该写

arr.at(read<int>(input)) = <something>;

因为否则您将面临缓冲区溢出漏洞。如果输入文件有一个超出范围的整数,那么您将超出范围。

【讨论】:

  • 对不起,DefaultConstructible 是什么意思?
  • @It'sNotALie。基本上,这个函数可以让你写read&lt;MyType&gt;(input)。这个函数要求MyType有一个默认构造函数(没有参数的构造函数),否则T result;行会失败
  • 啊,我明白了,这似乎是最好的解决方案:)
【解决方案2】:

当然,您可以通过构造一个临时的istream_iterator 来做到这一点,例如:

arr[*istream_iterator<int>(input)] = something

【讨论】:

  • 我刚刚发现我认为这个问题的副本没有这个答案所以I've added this answer there as well 并投票欺骗了这个问题。如果有人愿意去看看,我已经加强了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多