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

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

<分区>

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

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);}

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

最佳答案

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

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

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

关于c++ - 间接运算符的定义质量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38702154/

相关文章:

c++ - 使用unique_lock锁定互斥锁时调用std::system_error

java - 如何将这种多重继承转换为Java中的接口(interface)?

c++ - 如何正确地将带有 vtable 的类实例写入和读取到 QSharedMemory 中?

c++ - 在 vector 上使用基于范围的 for 循环时,CppCoreChecker C 样式转换警告

c++ - 在一个函数中嵌入不同的函数 : functor or lambda?

python - 在 python 中的两个对象之间的操作中,其操作重载为优先级?

C++ 堆警告 : Free heap block modified after it was freed

c++ - 模板默认参数 SFINAE 与 clang 不明确,适用于 g++

C++ 重载运算符 +

c++ - 整数类型搞乱了 sizeof(T)