Die Implementierung von Vergleichsoperatoren über 'Tupel' und 'Band', eine gute Idee?

(Hinweis: tuple und tie genommen werden kann, die von Boost und C++11.)

Beim schreiben von kleinen Strukturen mit nur zwei Elementen, die ich manchmal dazu neigen, wählen Sie eine std::pair, wie alle wichtigen Dinge bereits erledigt, die für diesen Datentyp, wie operator< für strengen-schwach-Bestellung.

Die Nachteile sind jedoch die ziemlich nutzlos Variablen-Namen. Auch wenn ich selbst erstellt, die typedef wird, werde ich mich nicht daran erinnern, 2 Tage später, was first und was second genau war, vor allem, wenn Sie beide vom selben Typ sind. Dies wird noch schlimmer, wenn mehr als zwei Mitglieder, als Schachteln pairs ziemlich viel saugt.

Die andere option ist, liegt tuple entweder von Boost und C++11, aber nicht wirklich Aussehen schöner und klarer. Also gehe ich zurück zu dem schreiben der struct selbst, einschließlich eventuell benötigter Vergleich Betreiber.

Da vor allem die operator< können sehr umständlich, ich dachte, der Umgehung dieser ganze Schlamassel nur durch die Berufung auf die Operationen definiert, die für tuple:

Beispiel operator< z.B. für strengen-schwach-Bestellung:

bool operator<(MyStruct const& lhs, MyStruct const& rhs){
  return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
         std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}

(tie macht einen tuple von T& Hinweise aus der übergebenen Argumente.)


Bearbeiten: Der Vorschlag von @DeadMG an privat Erben von tuple ist nicht schlecht, aber es hat einige Nachteile:

  • Wenn die Betreiber frei stehen (eventuell Freunden), die ich brauche, um zu Erben öffentlich
  • Mit casting, meine Funktionen /Operatoren (operator= speziell) können leicht umgangen werden
  • Mit der tie Lösung, kann ich dann bestimmte Mitglieder, wenn Sie nicht wichtig für die Bestellung

Gibt es irgendwelche Nachteile bei dieser Implementierung, dass ich beachten muss?

  • Perfekt sieht mir vernünftig...
  • Das ist eine sehr clevere Idee, auch wenn es nicht pan out. Ich bin zu haben, um das zu prüfen.
  • Das sieht ziemlich vernünftig. Die einzige Gefahr, die ich gerade denke, ist, dass tie kann nicht angewendet werden, um bit-Feld der Mitglieder.
  • Schade gibt es nicht eine Art von Selbstbeobachtung, so dass Sie tun können, diese automatisch für jede Klasse - also haben die Standard-Vergleichsoperatoren. Die Band-trick ist cool, aber.
  • Ich mag diese Idee! Wenn die tie(...) Anrufe gehen, dupliziert werden in unterschiedlichen Operatoren (=, ==, <, etc.) Sie schreiben konnte, ein eigenes inline-Methode make_tuple(...) zu Kapseln und dann rufen Sie es von den verschiedenen anderen Orten, wie in return lhs.make_tuple() < rhs.make_tuple(); (obwohl der Rückgabetyp von dieser Methode könnte sein, Spaß zu erklären!)
  • C++14 ist die Rettung! auto tied() const{ return std::tie(the, members, here); }

InformationsquelleAutor Xeo | 2011-06-02
Schreibe einen Kommentar