Реализация операторов сравнения через «кортеж» и «привязка», хорошая идея?

(Примечание: 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 я могу оставить вне определенных членов, если они не имеют значения для упорядочивания

Есть ли какие-либо недостатки в этой реализации, которые мне нужно учитывать?

94
задан ks1322 10 February 2016 в 10:16
поделиться