Ich habe Code, wodurch ich eine Struktur für eine std::set
von Objekten des Typs A
abfragen kann, die alle einige Kriterien erfüllen. Ich möchte sehr oft, dass meine Abfragekriterien so sind, dass der Code eine Menge zurückgibt, die nur ein Objekt enthält. Und in diesen Fällen möchte ich, dass mein Code fehlschlägt, wenn die Abfrage nicht nur ein Ergebnis erzeugt hat. So würde Ich mag eine Funktion machenWas ist die definierende Qualität des Indirektionsoperators?
A& deref_or_throw(std::set<A> s)
{ if (s.size() != 1) throw ...; return *s.begin(); }
, die wirft, wenn der Satz mehr als ein (oder keine) Element enthält, und dereferenziert das erste Element anders.
Der Kürze halber, dachte ich den Indirektionsoperator zu überlasten, die nicht für std::set
definiert:
A& operator*(std::set<A>& s) {return deref_or_throw(s);}
Ist dies eine schlechte Idee? Es passt mit dem Konzept des Indirektionsoperators, dass es eine Dereferenzierung durchführt. Aber ich konnte keine strenge Definition dafür finden, was der Indirektionsoperator gemäß den Standards tun sollte, um sicherzustellen, ob ich seinen Standardgebrauch pervertiere (zu weit).
Für mich ergibt es keinen Sinn. '*' bedeutet, gib mir das auf das Objekt hingewiesen. Ich hasse es, Operatoren zu verwenden, die etwas anderes machen als das, was sie für einen Standardtyp tun würden. – NathanOliver
@NathanOliver: also sollten Sie nicht operator '<<' zum Einfügen von Objekten in Streams verwenden, da dies ursprünglich der bitweise Linksverschiebungsoperator ist ... – shrike
@shrike Was meinen Sie ursprünglich? Als C++ in 98 standardisiert wurde, war es sowohl der Sift- als auch der Stream-Operator. Sollten sie einen neuen Betreiber gemacht haben, IDK. Ist es zu spät, um es jetzt zu ändern, ja – NathanOliver