(Примечание: tupleи tieможет быть взято из Boost или C ++ 11.)
При написании небольших структур только с двумя элементами я иногда склоняюсь к выбору a std::pair, поскольку все важные вещи уже сделаны для этого типа данных, например, operator<для строгого-слабого упорядочения .
Минусами являются бесполезные имена переменных. Даже если бы я сам это создал typedef, через 2 дня я не вспомню, что firstи что secondименно было, особенно если они оба одного типа. Ситуация становится еще хуже для более чем двух участников, поскольку вложение - pairотстой.
Другой вариант для этого -tupleлибо из Boost, либо из C ++ 11, но на самом деле это не выглядит лучше и понятнее. Поэтому я сам возвращаюсь к написанию структур, включая все необходимые операторы сравнения.
Поскольку в особенности это operator<может быть довольно громоздко, я подумал о том, чтобы обойти весь этот беспорядок, просто полагаясь на операции, определенные для tuple:
Пример operator<, например, для строгого-слабого упорядочивания:
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Делает tupleиз T&ссылок из переданных аргументов.)
Изменить : предложение @DeadMG о частном наследовании от tupleне является плохим, но у него есть некоторые недостатки:
- Если операторы автономные (возможно, друзья), мне нужно наследовать публично
- С кастингом мои функции / операторы (в
operator=частности) можно легко обойти - С помощью
tieрешения я могу исключить некоторых участников, если они не имеют значения для заказа.
Есть ли в этой реализации недостатки, которые мне нужно учитывать?