(Примечание: 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
решения я могу исключить некоторых участников, если они не имеют значения для заказа.
Есть ли в этой реализации недостатки, которые мне нужно учитывать?