(Uwaga: tuple
i tie
moż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 first
i co second
dokł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ę pair
jest 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);
}
( tie
Sprawia, że tuple
z T&
referencjami od przekazanych argumentów.)
Edycja : sugestia @DeadMG dotycząca prywatnego dziedziczenia z tuple
nie 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
tie
rozwią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ę?