(Uwaga: tuplei tiemożna je pobrać z Boost lub C ++ 11.)
Podczas pisania małych struktur z tylko dwoma elementami, czasami wybieram std::pair, ponieważ wszystkie ważne rzeczy są już zrobione dla tego typu danych, jak operator<na przykład porządkowanie ścisłe-słabe .
Wadą są jednak prawie bezużyteczne nazwy zmiennych. Nawet jeśli sam to stworzyłem typedef, dwa dni później nie pamiętam, co firsti co seconddokładnie było, zwłaszcza jeśli są tego samego typu. Sytuacja jest jeszcze gorsza w przypadku więcej niż dwóch członków, ponieważ zagnieżdżanie się pairjest do niczego.
Inną opcją jesttuple, albo z Boost, albo C ++ 11, ale to naprawdę nie wygląda ładniej i wyraźniej. Więc wracam do pisania struktur samodzielnie, włączając wszelkie potrzebne operatory porównania.
Ponieważ szczególnie operator<może to być dość uciążliwe, pomyślałem o obejściu tego całego bałaganu, polegając tylko na operacjach zdefiniowanych dla tuple:
Przykład operator<, np. Dla ścisłego-słabego uporządkowania:
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);
}
( tieSprawia, że tuplez T&referencjami od przekazanych argumentów.)
Edycja : sugestia @DeadMG dotycząca prywatnego dziedziczenia z tuplenie jest zła, ale ma kilka wad:
- Jeśli operatorzy są wolnostojący (prawdopodobnie przyjaciele), muszę dziedziczyć publicznie
- Dzięki rzutowaniu moje funkcje / operatory (w
operator=szczególności) można łatwo ominąć - Dzięki
tierozwiązaniu mogę pominąć niektórych członków, jeśli nie mają znaczenia przy składaniu zamówienia
Czy są jakieś wady tej implementacji, które muszę wziąć pod uwagę?