(Nota: tuple
e tie
può essere preso da Boost o C ++ 11.)
Quando si scrivono strutture piccole con solo due elementi, a volte tendo a scegliere a std::pair
, poiché tutte le cose importanti sono già fatte per quel tipo di dati, come operator<
per l'ordinamento rigoroso-debole .
Gli svantaggi però sono i nomi delle variabili praticamente inutili. Anche se l'ho creato io stesso typedef
, non ricorderò 2 giorni dopo cosa first
e cosa second
fosse esattamente, soprattutto se sono entrambi dello stesso tipo. Questo diventa anche peggio per più di due membri, dato che l'annidamento fa pair
schifo.
L'altra opzione è atuple
, sia da Boost che da C ++ 11, ma in realtà non sembra più bello e chiaro. Quindi torno a scrivere le strutture da solo, inclusi gli operatori di confronto necessari.
Dato che soprattutto operator<
può essere piuttosto macchinoso, ho pensato di aggirare tutto questo casino affidandomi semplicemente alle operazioni definite per tuple
:
Esempio di operator<
, ad esempio, per l'ordinamento rigoroso debole:
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
crea una serie tuple
di T&
riferimenti dagli argomenti passati.)
Modifica : il suggerimento di @DeadMG di ereditare privatamente da tuple
non è cattivo, ma ha alcuni svantaggi:
- Se gli operatori sono indipendenti (possibilmente amici), devo ereditare pubblicamente
- Con il casting, le mie funzioni / operatori (in
operator=
particolare) possono essere facilmente aggirati - Con la
tie
soluzione, posso escludere alcuni membri se non sono importanti per l'ordinazione
Ci sono degli svantaggi in questa implementazione che devo considerare?
tie
non può essere applicato ai membri del campo di bit.
tie(...)
chiamate verranno duplicate in vari operatori (=, ==, <, ecc.), Potresti scrivere un metodo inline privato make_tuple(...)
per incapsularlo e poi chiamarlo da vari altri posti, come in return lhs.make_tuple() < rhs.make_tuple();
(sebbene il tipo di ritorno da che metodo potrebbe essere divertente da dichiarare!)
auto tied() const{ return std::tie(the, members, here); }