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