0

我有代码,可以查询结构以查找所有符合某些条件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);}

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

4

1 回答 1

2

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

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

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

于 2016-08-01T15:32:20.997 回答