(Примітка: 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); }