(Nota: tuple
e tie
pode ser obtido de Boost ou C ++ 11.)
Ao escrever pequenas estruturas com apenas dois elementos, às vezes tendo a escolher um std::pair
, pois todas as coisas importantes já foram feitas para esse tipo de dados, como operator<
para ordenação estrita-fraca .
As desvantagens, porém, são os nomes de variáveis praticamente inúteis. Mesmo que eu mesmo tenha criado isso typedef
, não vou me lembrar 2 dias depois o que first
e o que second
exatamente foi, especialmente se ambos forem do mesmo tipo. Isso fica ainda pior para mais de dois membros, já que aninhar pair
é uma droga.
A outra opção para isso é umtuple
, tanto do Boost quanto do C ++ 11, mas isso não parece nem um pouco melhor e mais claro. Portanto, volto a escrever as estruturas sozinho, incluindo quaisquer operadores de comparação necessários.
Uma vez que, especialmente, o operator<
pode ser bastante complicado, pensei em contornar toda essa bagunça apenas contando com as operações definidas para tuple
:
Exemplo de operator<
, por exemplo, para ordenação estrita-fraca:
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 uma tuple
das T&
referências dos argumentos passados.)
Edit : A sugestão de @DeadMG para herdar de forma privada tuple
não é ruim, mas tem algumas desvantagens:
- Se os operadores forem independentes (possivelmente amigos), preciso herdar publicamente
- Com a transmissão, minhas funções / operadores (
operator=
especificamente) podem ser facilmente contornados - Com a
tie
solução, posso deixar de fora determinados membros se eles não importarem para o pedido
Há alguma desvantagem nessa implementação que preciso considerar?
tie
não pode ser aplicada a membros de campo de bits.
tie(...)
chamadas forem duplicadas em vários operadores (=, ==, <, etc.), você pode escrever um método inline privado make_tuple(...)
para encapsular isso e, em seguida, chamá-lo de vários outros lugares, como em return lhs.make_tuple() < rhs.make_tuple();
(embora o tipo de retorno de esse método pode ser divertido de declarar!)
auto tied() const{ return std::tie(the, members, here); }