(Remarque: tuple
et tie
peut être extrait de Boost ou C ++ 11.)
Lors de l'écriture de petites structures avec seulement deux éléments, j'ai parfois tendance à choisir a std::pair
, car toutes les choses importantes sont déjà faites pour ce type de données, comme operator<
pour l'ordre strict-faible .
Les inconvénients sont cependant les noms de variables à peu près inutiles. Même si je l'ai moi-même créé typedef
, je ne me souviendrai pas 2 jours plus tard de ce first
que second
c'était et de ce que c'était exactement, surtout s'ils sont tous les deux du même type. Cela devient encore pire pour plus de deux membres, car la nidification pair
est vraiment nul.
L'autre option pour cela est untuple
, que ce soit à partir de Boost ou de C ++ 11, mais cela n'a pas vraiment l'air plus beau et plus clair. Je reviens donc à l'écriture des structures moi-même, y compris les opérateurs de comparaison nécessaires.
Puisque surtout cela operator<
peut être assez encombrant, j'ai pensé à contourner tout ce gâchis en me basant simplement sur les opérations définies pour tuple
:
Exemple de operator<
, par exemple pour un ordre strict-faible:
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
fait tuple
des T&
références à partir des arguments passés.)
Edit : La suggestion de @DeadMG d'hériter en privé tuple
n'est pas mauvaise, mais elle présente de nombreux inconvénients:
- Si les opérateurs sont autonomes (éventuellement amis), je dois hériter publiquement
- Avec le casting, mes fonctions / opérateurs (en
operator=
particulier) peuvent être facilement contournés - Avec la
tie
solution, je peux laisser de côté certains membres s'ils ne comptent pas pour la commande
Y a-t-il des inconvénients dans cette implémentation que je dois prendre en compte?
tie
ne peut pas être appliqué aux membres de champ de bits.
tie(...)
appels doivent être dupliqués dans divers opérateurs (=, ==, <, etc.), vous pouvez écrire une méthode en ligne privée make_tuple(...)
pour encapsuler cela, puis l'appeler à partir de divers autres endroits, comme dans return lhs.make_tuple() < rhs.make_tuple();
(bien que le type de retour de cette méthode pourrait être amusante à déclarer!)
auto tied() const{ return std::tie(the, members, here); }