Si j'ai un objet comme celui-ci:
struct Foo {
Bar const& bar();
};
3 Réponses :
Je pense que vous devez créer un objet de prédicat qui prend deux instances de FOO et son opérateur () peut appeler FOO :: bar () sur les deux instances.
Quelque chose comme p> Utilisez P> ...
boost::multi_index::ordered_unique<boost::multi_index::tag<tag_prop>,
boost::multi_index::identity<Foo>, MyPredicate>,
...
Autant que j'aime utiliser Lambdas pour faire des choses simples, cela peut rapidement dégénérer :)
Dans votre cas, car il est un peu plus compliqué, je vous fierais soit sur une fonction libre ou un comparateur de prédicat. p>
Le prédicat présente l'avantage de définir des types plus clairement, il est généralement plus facile de l'apporter en réalité. p>
aussi, pour l'amour de la lisibilité, j'ai généralement typé de mon index, qui donne: P >
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;
D'accord. J'utilise généralement des alias Typefs et des espaces de noms également, mais cela semblait trop compliqué pour cet exemple trivial, alors je les ai effondrée à une seule déclaration.
Plutôt que de fournir un comparateur défini par l'utilisateur, vous pouvez écrire un extracteur de clé défini par l'utilisateur em>: em> > xxx pré> voir