У меня есть код, посредством которого я могу запросить структуру для объекта 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
@NathanOliver: поэтому вы не должны использовать оператор '<<' для вставки объектов в потоки, так как это изначально побитовый оператор сдвига влево ... – shrike
@shrike Что вы подразумеваете под первоначально? Когда C++ был стандартизирован в 98, он был как оператором sift, так и потоком. Если они сделали нового оператора, idk. Должно быть, это уже поздно, да – NathanOliver