(Примітка: tuple
і tie
може бути взято з Boost , або C ++ 11.)
При написанні невеликих структур тільки з двох елементів, я іноді , як правило, вибрати std::pair
, так як всі важливі речі вже зроблена для цього типу даних, як operator<
для суворого слабкого упорядкування .
Недоліками є, однак, досить марні імена змінних. Навіть якщо я сам це створив typedef
, я не пам’ятатиму через 2 дні, що first
і що second
саме було, особливо якщо вони обидва однотипні. Це стає ще гіршим для більш ніж двох членів, оскільки вкладеність pair
майже відмовна.
Інший варіант - atuple
, або від 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
рішення я можу виключити певних учасників, якщо вони не мають значення для замовлення
Чи є у цій реалізації недоліки, які мені потрібно врахувати?
tie
не може бути застосована до членів бітового поля.
tie(...)
виклики будуть дублюватися в різних операторах (=, ==, <і т. Д.), Ви можете написати приватний вбудований метод, make_tuple(...)
щоб інкапсулювати це, а потім викликати його з різних інших місць, як у return lhs.make_tuple() < rhs.make_tuple();
(хоча тип повернення з цей метод може бути цікаво оголосити!)
auto tied() const{ return std::tie(the, members, here); }