【问题标题】:Calling a specific overload of c++ insertion operator (>>) explicitly?显式调用 c++ 插入运算符 (>>) 的特定重载?
【发布时间】:2018-12-10 01:54:25
【问题描述】:

所以我有以下三行代码困扰着我:

int choice;
std::cin >> choice;
platform = platforms[choice];

感觉它应该是一个单行但我坚持如何实现它。

我在想这样的事情:

platform = platforms[(int)operator>>(std::cin)];

但显然不完全是因为编译器不会有它。

【问题讨论】:

  • operator>> 返回一个流,将其转换为 int 是没有意义的。不要以为没有辅助函数就可以做到这一点。
  • 可能是 platform = platforms[ *std::istream_iterator<int>( cin ) ];,但如果 operator>> 失败,这将是 UB。所以你应该为std::cin启用异常来处理错误。
  • 您的代码非常不安全 - 用户可以输入任何内容。你想做什么只会使情况恶化。你想达到什么目标?如果要减少代码量,那么这里不是你应该做的地方。
  • 感谢代码完全可以解决问题(如果您将其作为答案提出来,我肯定会感谢它)。 - 我知道代码是多么不安全 - 它仅供我自己在编写一些一次性代码时使用。
  • 只是为了大家的娱乐,我想出的是 'platform = platforms[(int)[](){int choice; std::cin >> 选择;回报选择; }()];' ...这就是旧的强迫症开始了:)

标签: c++


【解决方案1】:

你需要一个辅助函数来做到这一点。

感谢 lambda,您可以在一个表达式中做到这一点:

platform = platforms[([](){int choice; std::cin >> choice; return choice;}())];

【讨论】:

  • 几乎逐字逐句我最终想出了什么,尽管 lambda 确实需要一个外括号或类似的东西来分解两个连续的左方括号问题(请参阅stackoverflow.com/questions/39411971/…)......但后来我发现zett42 评论中的 sn-p 更加整洁。
  • 添加了括号。
猜你喜欢
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多