Implementar operadores de comparação via 'tupla' e 'empate', uma boa ideia?
(Nota:tuple
etie
pode ser obtido no Boost ou no C ++ 11.)
Ao escrever pequenas estruturas com apenas dois elementos, às vezes tento escolher umstd::pair
, como todas as coisas importantes já foram feitas para esse tipo de dados, comooperator<
para pedidos estritamente fracos.
As desvantagens são os nomes de variáveis praticamente inúteis. Mesmo se eu tivesse criado essetypedef
, Não me lembrarei 2 dias depois do quefirst
e o quesecond
exatamente era, especialmente se eles são do mesmo tipo. Isso fica ainda pior para mais de dois membros, pois aninharpair
é uma merd
A outra opção para isso é umtuple
, seja do Boost ou do C ++ 11, mas isso realmente não parece mais agradável e claro. Então, volto a escrever as estruturas, incluindo todos os operadores de comparação necessário
Desde especialmente ooperator<
pode ser bastante complicado, pensei em contornar toda essa bagunça apenas confiando nas operações definidas paratuple
:
Exemplo deoperator<
, por exemplo. para pedidos estritamente fracos:
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
faz umtuple
doT&
referências dos argumentos passados.)
Edita: Sugestão de @DeadMG para herdar privadamente detuple
não é ruim, mas tem algumas desvantagens:
operator=
especificamente) pode ser facilmente ignoradoCom otie
solução, posso deixar de fora certos membros, se eles não importam para o pedidoHá alguma desvantagem nesta implementação que eu preciso considerar?