(Nota: tuple
y tie
se 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é first
y qué second
fue exactamente, especialmente si ambos son del mismo tipo. Esto se vuelve aún peor para más de dos miembros, ya que anidar pair
s 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);
}
( tie
Hace que una tuple
de T&
las referencias de los argumentos pasados.)
Editar : La sugerencia de @DeadMG de heredar de tuple
forma 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
tie
solució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?
tie
no 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); }