间接运算符的定义质量是什么?

时间:2016-08-01 15:02:16

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

我有代码,我可以查询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);}

这是个坏主意吗?它确实符合它执行解除引用的间接运算符的概念。但我找不到根据标准对间接算子应该做什么的严格定义,以确定我是否正在歪曲其标准用途(太远)。

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,operator*在任何标准容器上运行没有先例,因此将来如果有人查看代码,他们将不知道它的作用,而不会发现{{1}的实现}。相反,现在花费额外的10秒钟来复制粘贴你的函数调用名称,并保存你的未来维护者,他们知道从现在起一年内追捕操作员多少时间。

我会建议像operator*这样的东西,或者很明显发生了什么。