Насколько мне нравится использовать лямбды для простых вещей, это может быстро выродиться:)
В вашем случае, поскольку это немного сложнее, я бы полагался либо на свободную функцию, либо на предикатный компаратор.
Преимущество предиката состоит в более четком определении типов, поэтому обычно проще его ввести.
Кроме того, для удобства чтения я обычно печатаю свои индексы, что дает:
namespace mi = boost::multi_index;
struct FooComparator
{
bool operator()(Foo const& lhs, Foo const& rhs) const
{
return lhs.bar().property() < rhs.bar().property();
}
};
typedef mi::ordered_unique <
mi::tag<tag_prop>,
mi::identity<Foo>,
FooComparator
> foo_bar_index_t;
typedef boost::multi_index_container <
Foo,
mi::indexed_by <
foo_bar_index_t,
// ... other indexes
>
> foo_container_t;
Подход с использованием предикатов требует большего количества стандартного кода, но он позволяет красиво отделить логику сравнения от определения индекса, которое само отделено от определения контейнера.
Четкое разделение облегчает обзор структуры.