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