У меня есть код, с помощью которого я могу запросить структуру для 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);}
Это плохая идея? Это согласуется с понятием оператора косвенности, что он выполняет разыменование. Но я не смог найти строгое определение того, что оператор косвенного обращения должен делать в соответствии со стандартами, чтобы убедиться, что я извращаю его стандартное использование (слишком далеко).
Не перегружайте operator*
в этом случае. Краткость одного человека — это запутанность другого человека.
В этом случае нет прецедента для operator*
работать в любом стандартном контейнере, поэтому в будущем, если кто-то посмотрит на код, он не поймет, что он делает, не найдя реализацию вашего кода. operator*
, Вместо этого, потратьте дополнительные 10 секунд, чтобы скопировать и вставить имя вызова функции и сохранить своих будущих сопровождающих, которые знают, сколько времени выискивает перегрузка оператора через год.
Я бы предложил, может быть, что-то вроде *ensure_single_element(your_set).begin()
или что-то, где совершенно ясно, что происходит.
Других решений пока нет …