【发布时间】: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: 所以你不应该使用运算符
<<将对象插入到流中,因为这原本是按位左移运算符... -
@shrike 你原来是什么意思?当 C++ 在 98 年标准化时,它既是 sift 又是流运算符。他们是否应该建立一个新的运营商,idk。现在改是不是晚了,是的
-
@shrike 我不同意这一点。如果我曾经看到执行
foo / bar的代码并且那不是除法,我就不会使用它。在不改变运算符含义的情况下,代码很难阅读。 -
我倾向于同意@NathanOliver 的观点。有时这种重载是有意义的(例如串联
boost::filesystem::path对象),但即便如此,它也会使理解代码库变得更加难以学习。
标签: c++ c++11 operator-overloading stdset indirection