我有代码,我可以查询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);}
这是个坏主意吗?它确实符合它执行解除引用的间接运算符的概念。但我找不到根据标准对间接算子应该做什么的严格定义,以确定我是否正在歪曲其标准用途(太远)。
答案 0 :(得分:2)
不要以这种方式重载operator*
。一个人的简洁是另一个人的混淆。
在这种情况下,operator*
在任何标准容器上运行没有先例,因此将来如果有人查看代码,他们将不知道它的作用,而不会发现{{1}的实现}。相反,现在花费额外的10秒钟来复制粘贴你的函数调用名称,并保存你的未来维护者,他们知道从现在起一年内追捕操作员多少时间。
我会建议像operator*
这样的东西,或者很明显发生了什么。