Что определяет качество оператора косвенного обращения?

У меня есть код, с помощью которого я могу запросить структуру для 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);}

Это плохая идея? Это согласуется с понятием оператора косвенности, что он выполняет разыменование. Но я не смог найти строгое определение того, что оператор косвенного обращения должен делать в соответствии со стандартами, чтобы убедиться, что я извращаю его стандартное использование (слишком далеко).

1

Решение

Не перегружайте operator* в этом случае. Краткость одного человека — это запутанность другого человека.

В этом случае нет прецедента для operator* работать в любом стандартном контейнере, поэтому в будущем, если кто-то посмотрит на код, он не поймет, что он делает, не найдя реализацию вашего кода. operator*, Вместо этого, потратьте дополнительные 10 секунд, чтобы скопировать и вставить имя вызова функции и сохранить своих будущих сопровождающих, которые знают, сколько времени выискивает перегрузка оператора через год.

Я бы предложил, может быть, что-то вроде *ensure_single_element(your_set).begin() или что-то, где совершенно ясно, что происходит.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]