2016-08-01 14 views
1

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

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

+5

Для меня это не имеет смысла. '*' означает дать мне указатель на объект. Я ненавижу использование операторов, которые делают что-то другое, чем то, что они будут делать на стандартном типе. – NathanOliver

+0

@NathanOliver: поэтому вы не должны использовать оператор '<<' для вставки объектов в потоки, так как это изначально побитовый оператор сдвига влево ... – shrike

+2

@shrike Что вы подразумеваете под первоначально? Когда C++ был стандартизирован в 98, он был как оператором sift, так и потоком. Если они сделали нового оператора, idk. Должно быть, это уже поздно, да – NathanOliver

ответ

2

Не перегружайте operator* таким образом. Краткость одного человека - обфускация другого человека.

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

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

+0

Это не отвечает на вопрос ... – ciamej

+1

Вопрос OP, который я вижу, это «это плохая идея?».Для меня этот ответ говорит, что да, и предлагает подходящую альтернативу и почему (то есть читаемость). –

+0

Я поставил «нет, не делай этого» ведущее предложение, оставив существующие рассуждения на месте. –

 Смежные вопросы

  • Нет связанных вопросов^_^