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