【问题标题】:What is the defining quality of the indirection operator? [closed]间接运算符的定义质量是什么? [关闭]
【发布时间】:2016-12-06 17:29:53
【问题描述】:

我有代码,我可以查询一个结构以查找 std::set 类型的对象的 A 类型,这些对象都符合某些条件。我经常希望我的查询条件是这样的,即代码返回一个只包含一个对象的集合。在这些情况下,如果查询没有只产生一个结果,我会希望我的代码失败。所以我想做一个函数

A& deref_or_throw(std::set<A> s)
{ if (s.size() != 1) throw ...; return *s.begin(); }

如果集合包含多个(或没有)元素,则抛出,否则取消引用第一个元素。

为了简洁,我想重载间接运算符,它没有为std::set定义:

A& operator*(std::set<A>& s) {return deref_or_throw(s);}

这是个坏主意吗?它确实符合执行取消引用的间接运算符的概念。但是我找不到一个严格的定义,间接操作符根据标准应该做什么,以确保我是否歪曲了它的标准使用(太远了)。

【问题讨论】:

  • 对我来说这没有意义。 * 表示给我指向对象。我讨厌使用与标准类型不同的操作符。
  • @NathanOliver: 所以你不应该使用运算符&lt;&lt; 将对象插入到流中,因为这原本是按位左移运算符...
  • @shrike 你原来是什么意思?当 C++ 在 98 年标准化时,它既是 sift 又是流运算符。他们是否应该建立一个新的运营商,idk。现在改是不是晚了,是的
  • @shrike 我不同意这一点。如果我曾经看到执行foo / bar 的代码并且那不是除法,我就不会使用它。在不改变运算符含义的情况下,代码很难阅读。
  • 我倾向于同意@NathanOliver 的观点。有时这种重载是有意义的(例如串联boost::filesystem::path 对象),但即便如此,它也会使理解代码库变得更加难以学习。

标签: c++ c++11 operator-overloading stdset indirection


【解决方案1】:

不要以这种方式超载operator*。一个人的简洁是另一个人的混淆。

在这种情况下,operator* 在任何标准容器上运行都没有先例,因此将来如果有人查看代码,如果没有找到您的 operator* 的实现,他们将不知道它做了什么。相反,现在多花 10 秒来复制粘贴您的函数调用名称,并节省您未来的维护人员,他们知道一年后要花多少时间来寻找运算符过载。

我会建议类似*ensure_single_element(your_set).begin() 之类的东西,或者很清楚发生了什么的东西。

【讨论】:

  • 这不能回答问题...
  • 我看到的 OP 问题是“这是一个坏主意吗?”。对我来说,这个答案说,是的,并提出了一个合适的替代方案,以及为什么(即可读性)。
  • 我放了一个“不,不要这样做”的前导句,保留现有的推理。
  • op 想知道“根据标准,间接操作符应该做什么”。我也想! “不要这样做,这很糟糕”只是一种观点。
  • 我读到的问题是“以这种不寻常的方式超载operator* 是不是一个坏主意?”。也许我们可以让 OP 澄清它们的含义。
猜你喜欢
  • 2014-01-14
  • 2011-02-04
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多