(Hinweis: tuple
und tie
kann aus Boost oder C ++ 11 übernommen werden.)
Wenn ich kleine Strukturen mit nur zwei Elementen schreibe, neige ich manchmal dazu, a zu wählen std::pair
, da alle wichtigen Dinge für diesen Datentyp bereits erledigt sind, wie operator<
zum Beispiel für strikt schwache Ordnungen .
Die Nachteile sind jedoch die ziemlich nutzlosen Variablennamen. Selbst wenn ich das selbst geschaffen habe typedef
, werde ich mich 2 Tage später nicht mehr daran erinnern, was first
und was second
genau war, besonders wenn beide vom gleichen Typ sind. Dies wird für mehr als zwei Mitglieder noch schlimmer, da das Verschachteln pair
ziemlich scheiße ist.
Die andere Option dafür ist atuple
, entweder von Boost oder C ++ 11, aber das sieht nicht wirklich schöner und klarer aus. Also schreibe ich die Strukturen wieder selbst, einschließlich aller erforderlichen Vergleichsoperatoren.
Da besonders das operator<
ziemlich umständlich sein kann, dachte ich daran, dieses ganze Durcheinander zu umgehen, indem ich mich nur auf die Operationen stütze, die definiert sind für tuple
:
Beispiel operator<
zB für streng-schwache Ordnung:
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&
Referenzen aus den übergebenen Argumenten.)
Bearbeiten : Der Vorschlag von @DeadMG, privat zu erben, tuple
ist nicht schlecht, hat aber einige Nachteile:
- Wenn die Betreiber freistehend sind (möglicherweise Freunde), muss ich öffentlich erben
- Beim Casting können meine Funktionen / Operatoren (
operator=
speziell) leicht umgangen werden - Mit der
tie
Lösung kann ich bestimmte Mitglieder auslassen, wenn sie für die Bestellung keine Rolle spielen
Gibt es irgendwelche Nachteile bei dieser Implementierung, die ich berücksichtigen muss?
tie
sie nicht auf Bitfeldmitglieder angewendet werden kann.
tie(...)
Aufrufe in verschiedenen Operatoren (=, ==, <usw.) dupliziert werden sollen, können Sie eine private Inline-Methode schreiben, um dies make_tuple(...)
zu kapseln, und sie dann von den verschiedenen anderen Stellen aus aufrufen, wie in return lhs.make_tuple() < rhs.make_tuple();
(obwohl der Rückgabetyp von Diese Methode könnte Spaß machen zu erklären!)
auto tied() const{ return std::tie(the, members, here); }