(Nota: tupley tiese puede tomar de Boost o C ++ 11.)
Cuando escribo estructuras pequeñas con solo dos elementos, a veces tiendo a elegir a std::pair, ya que todas las cosas importantes ya están hechas para ese tipo de datos, como operator<para el orden estricto-débil .
Sin embargo, las desventajas son los nombres de variables prácticamente inútiles. Incluso si yo mismo creé eso typedef, no recordaré 2 días después qué firsty qué secondfue exactamente, especialmente si ambos son del mismo tipo. Esto se vuelve aún peor para más de dos miembros, ya que anidar pairs apesta.
La otra opción para eso es untuple, ya sea de Boost o C ++ 11, pero eso en realidad no se ve más agradable y claro. Así que vuelvo a escribir las estructuras yo mismo, incluidos los operadores de comparación necesarios.
Dado que especialmente operator<puede ser bastante engorroso, pensé en eludir todo este lío simplemente confiando en las operaciones definidas para tuple:
Ejemplo de operator<, por ejemplo, para el orden estricto-débil:
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);
}
( tieHace que una tuplede T&las referencias de los argumentos pasados.)
Editar : La sugerencia de @DeadMG de heredar de tupleforma privada no es mala, pero tiene algunos inconvenientes:
- Si los operadores son independientes (posiblemente amigos), necesito heredar públicamente
- Con el casting, mis funciones / operadores (
operator=específicamente) se pueden omitir fácilmente - Con la
tiesolución, puedo dejar fuera a ciertos miembros si no son importantes para el pedido.
¿Hay algún inconveniente en esta implementación que deba considerar?
tieno se puede aplicar a miembros de campo de bits.
tie(...)llamadas se van a duplicar en varios operadores (=, ==, <, etc.), puede escribir un método en línea privado make_tuple(...)para encapsularlo y luego llamarlo desde los otros lugares, como en return lhs.make_tuple() < rhs.make_tuple();(aunque el tipo de retorno de ¡Ese método podría ser divertido de declarar!)
auto tied() const{ return std::tie(the, members, here); }